Problem Description
度度熊最近很喜欢玩游戏。这一天他在纸上画了一个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
Hint
对于第二组样例,共5种方案,具体方案为:
思路:
卡特兰数把第一行数看作为
0
0
0;
第二行数看作为
1
1
1;
则
000111
000111
000111 的序列就为
123
123
123
456
456
456,
001011
001011
001011的序列就为
124
124
124
356
356
356
则这个问题就转化成有几种满足题目条件的
01
01
01 序列
从A点到B点红线上的值为卡特兰数其前几项为(从第零项开始) : 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, …
卡特兰数 C n C_{n} Cn 满足以下递推关系
- C n + 1 = C 0 C n + C 1 C n − 1 + . . . + C n C 0 C_{n+1}=C_{0}C_{n}+C_{1}C_{n-1}+...+C_{n}C_{0} Cn+1=C0Cn+C1Cn−1+...+CnC0;
- ( n − 3 ) C n = n / 2 ( C 3 C n − 1 + C 4 C n − 2 + C 5 C n − 3 + . . . + C n − 2 C 4 + C n − 1 C 3 ) (n-3)C_{n}=n/2(C_{3}C_{n-1}+C_{4}C_{n-2}+C_{5}C_{n-3}+...+C_{n-2}C_{4}+C_{n-1}C_{3}) (n−3)Cn=n/2(C3Cn−1+C4Cn−2+C5Cn−3+...+Cn−2C4+Cn−1C3);
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
const ll mod=1e9+7;
const int maxx=1e6+5;
ll f[maxx];
ll fi[maxx];
void init(){
f[0]=1,f[1]=1;
for(int i=2;i<=maxx;i++){
f[i]=(mod-mod/i)*f[mod%i]%mod;
}
fi[0]=1;fi[1]=1;fi[2]=1;
for(int i=3;i<=maxx;i++){
fi[i]=fi[i-1]*((4+10*mod-6*f[i-1])%mod)%mod;
}
}
int main(){
int t,Case=0;
scanf("%d",&t);
init();
while(t--){
int n;
scanf("%d",&n);
printf("Case #%d:\n%lld\n",++Case,fi[n+2]);
}
return 0;
}
实践是检验真理的唯一标准