简介:卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名,其前几项为(从第零项开始) : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...
前三十位卡特兰数
[1,1,2,5,14,42,132,429,1430,4862,16796,58786,
208012,742900,2674440,9694845,35357670,129644790,
477638700,1767263190,6564120420,24466267020,
91482563640,343059613650,1289904147324,
4861946401452,18367353072152,69533550916004,
263747951750360,1002242216651368,3814986502092304]
公式:
https://baike.baidu.com/item/卡特兰数/6125746?fr=aladdin
应用:
更多应用:https://blog.csdn.net/wookaikaiko/article/details/81105031 https://blog.csdn.net/w1304636468/article/details/89948819
HDOJ 4828
度度熊最近很喜欢玩游戏。这一天他在纸上画了一个2行N列的长方形格子。他想把1到2N这些数依次放进去,但是为了使格子看起来优美,他想找到使每行每列都递增的方案。不过画了很久,他发现方案数实在是太多了。度度熊想知道,有多少种放数字的方法能满足上面的条件?
Input
第一行为数据组数T(1<=T<=100000)。
然后T行,每行为一个数N(1<=N<=1000000)表示长方形的大小。
Output
对于每组数据,输出符合题意的方案数。由于数字可能非常大,你只需要把最后的结果对1000000007取模即可。
Sample Input
2 1 3
Sample Output
Case #1: 1 Case #2: 5
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int MAXN = 1000000;
LL base = 1E9 + 7;
LL ans[MAXN+5];
//计算 ax+by=gcd(a,b),返回gcd值,求出xy
LL Ex_gcd(LL a, LL b, LL &x, LL &y)
{
LL d;
if (a == 0 && b == 0)
return -1;// 无GCD
if (b == 0)
{
x = 1;
y = 0;
return a;
}
d = Ex_gcd(b, a%b, y, x);
y -= a / b * x;
return d;
}
//求a关于模n的逆元,不存在返回-1
LL Mod_reverse(LL a, LL n)
{
LL x, y, d;
d = Ex_gcd(a, n, x, y);
if (d == 1)
return (x % n + n) % n;
else
return -1;
}
void work()
{
LL i, inv;
memset(ans,0,sizeof(ans));
ans[1] = 1;
for (i = 2; i <= MAXN; i++)
{
inv = Mod_reverse(i + 1, base);
ans[i] = (4 * i - 2) * ans[i - 1] % base;
ans[i] = ans[i] * inv % base;
}
}
int main()
{
int i, n, T;
scanf("%d",&T);
work();
for (i = 1; i <= T; i++)
{
scanf("%d",&n);
printf("Case #%d:\n",i);
printf("%I64d\n",ans[n]);
}
return 0;
}