卡特兰数模板:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const long long mod=1000000007;
long long n;
long long ans[1100000],ni[1100000];
long long power(long long a,long long n,long long m)
{
long long ans=1,tmp=a;
while(n)
{
if(n&1)
ans=ans*tmp%m;
tmp=tmp*tmp%m;
n=n>>1;
}
return ans%m;
}
void init()
{
ans[0]=1;
ans[1]=1;
for(long long i=1;i<=1000005;i++)
ni[i]=power(i,mod-2,mod)%mod;
for(long long i=2;i<=1000000;i++)
ans[i]=(4*i-2)%mod*ans[i-1]%mod*ni[i+1]%mod;
}
int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
long long res=0,tmp=1;
for(long long i=0;i*2<=n;i++)
{
res=(res+tmp*ans[i]%mod)%mod;
tmp=tmp*(n-2*i)%mod*(n-2*i-1)%mod*ni[2*i+1]%mod*ni[2*i+2]%mod;
}
cout<<res<<endl;
}
return 0;
}
默慈金数模板:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const long long mod=1000000007;
long long n;
long long ans[1100000];
long long power(long long a,long long n,long long m)
{
long long ans=1,tmp=a;
while(n)
{
if(n&1)
ans=ans*tmp%m;
tmp=tmp*tmp%m;
n=n>>1;
}
return ans;
}
int main()
{
ans[1]=1;
ans[2]=2;
for(long long i=2;i<=1000000;i++)
ans[i+1]=((2*i+3)%mod*ans[i]%mod+3*i*ans[i-1]%mod)%mod*power(i+3,mod-2,mod)%mod;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
cout<<ans[n]<<endl;
}
return 0;
}