http://acm.hdu.edu.cn/showproblem.php?pid=4828
分析:
卡特兰数+乘法逆元
AC代码:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include<list>
#include <bitset>
#include <climits>
#include <algorithm>
#define gcd(a,b) __gcd(a,b)
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w",stdout)
typedef long long LL;
const LL mod=1e9+7;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
using namespace std;
LL Catalan[2000010];
LL exgcd(LL a,LL b,LL &x,LL &y){
if (b==0){
x=1;
y=0;
return a;
}
LL ans=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return ans;
}
LL ctl()
{
Catalan[0]=1;
Catalan[1]=1;
for(int i=2; i<=1000000;i++)
{
LL x,y;
exgcd(i+1,mod,x,y);
Catalan[i]=Catalan[i-1]*(4*i-2)%mod*((x%mod+mod)%mod)%mod;
}
}
int main (){
int t;
int n;
ctl();
//FIN;
scanf ("%d",&t);
int cc=1;
while (t--){
scanf ("%d",&n);
printf ("Case #%d:\n",cc++);
printf ("%lld\n",Catalan[n]);
}
return 0;
}