hdu 5673 卡特兰数,逆元

来源:互联网 发布:台湾娱乐圈知乎 编辑:程序博客网 时间:2024/05/16 04:56
<span style="font-size:18px;">//题目网址 http://acm.hdu.edu.cn/showproblem.php?pid=5673</span>
<span style="font-size:18px;">//以下参考过网上代码 http://m.blog.csdn.net/article/details?id=51227707</span>
<span style="font-size:18px;">#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;const int mod=1000000007,maxn=1000100;long long inv[maxn],h[maxn],c[maxn];void getinv()//求逆元{    int i;    inv[1]=1;    for(i=2;i<maxn;i++)    {        inv[i]=(mod-mod/i)*inv[mod%i]%mod;    }}int main(){    int i,T,n,k;    long long ans;    getinv();    h[1]=h[0]=1;    for(i=2;i<maxn;i++)//求卡特兰数(公式:c(n+1)=c(n)*(4*n-2)/(n+1))    {        h[i]=h[i-1]*(4*i-2)%mod*inv[i+1]%mod;    }    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        ans=c[0]=1;        for(i=1;i<=n;i++)        {            c[i]=c[i-1]*(n-i+1)%mod*inv[i]%mod;//求组合数(公式:c(n,i)=c(n,i-1)*(n-i+1)/i)                                                //(可根据c(n,m)=n!/((n-m)!*m!)自己推)        }        for(i=1;;i++)        {            k=n-(i<<1);            if(k<0)break;            ans=(ans+h[i]*c[k])%mod;        }        printf("%lld\n",ans);    }    return 0;}</span>

0 0
原创粉丝点击