标签:
有一个机器人位于坐标原点上。每秒钟机器人都可以向右移到一个单位距离,或者在原地不动。如果机器人的当前位置在原点右侧,它同样可以 向左移动单位距离。一系列的移动(左移,右移,原地不动)定义为一个路径。问有多少种不同的路径,使得nnn秒后机器人仍然位于坐标原点? 答案可能很大,只需输出答案对1,000,000,0071,000,000,0071,000,000,007的模。
输入包含多组数据. 第一行有一个整数T(1≤T≤100)T (1\leq T\leq 100)T(1≤T≤100), 表示测试数据的组数. 对于每组数据: 输入一个整数 n(1≤n≤1,000,000)n (1\leq n\leq 1,000,000)n(1≤n≤1,000,000)。
对于每组数据,输出一个整数
3 1 2 4
1 2 9#include<iostream> #include<cstring> #include<cstdio> #include<ctime> #include<cmath> #include<algorithm> #define N 1000000+5 using namespace std; typedef long long int LL; #define N 1000000+10 #define p 1000000007 LL ctl[N>>1]= {1,1},f[N]= {0,1},invf[N]= {0,1},inva[N]= {1,1}; void katelan() { for(int i=2; i<=(N>>1); i++) ctl[i]=((4*i-2)*(ctl[i-1])%p*invf[i+1])%p;//打出100W以内的卡特兰数 } void init() { for(int i=2; i<=N; i++) f[i]=f[i-1]*i%p;//打出100W以内n!mod1000000007 invf[1]=1; for(int i=2; i<=N; ++i) invf[i]=invf[p%i]*(p-p/i)%p;//打出100W以内数的逆元 for(int i=2; i<=N; ++i) inva[i]=inva[i-1]*invf[i]%p;//打出100W以内n!的逆元 } LL c(int a,int b) { return (f[a]*inva[b]%p)*inva[a-b]%p;//计算C(a,b) } LL solve(LL n) { LL sum=0; for(int i=0; i+i<=n; i++) { sum+=ctl[i]*c(n,2*i); sum%=p; } return sum; } int main() { init(); katelan(); //freopen("input.txt","r",stdin); int t; scanf("%d",&t); while(t--) { LL n; scanf("%I64d",&n); printf("%I64d\n",solve(n)); } return 0; }
标签:
原文地址:http://blog.csdn.net/qq_30927651/article/details/51362586