来源:HDU5673
机器人的题目,一道挺简单的计数问题
直接上代码吧:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
const int MOD = 1e9+7;
const int MAXN = 1e6+10;
int n;
LL inv[MAXN];
LL catalan[MAXN];
LL com[MAXN];//c[i]表示c(n,i),在main函数中间求
void ini_inv(){
inv[1]=1;
for(int i=2;i<=MAXN;i++){
inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
}
}
void ini_catalan(){
catalan[0]=1;
catalan[1]=1;
for(int i=2;i<=MAXN/2;i++){
catalan[i]=catalan[i-1]*(4*i-2)%MOD*inv[i+1]%MOD;
}
}
int main(){
int T;
ini_inv();
ini_catalan();
com[0]=1;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
LL du=n/2;
LL ans=0;
for(int i=1;i<=n;i++){
com[i]=com[i-1]*(n-i+1)%MOD*inv[i]%MOD;
}
for(int i=0;i<=du;i++){
ans=(ans+catalan[i]*com[2*i])%MOD;
}
cout<<ans<<endl;
}
return 0;
}
756

被折叠的 条评论
为什么被折叠?



