HDU 5651

来源:互联网 发布:遗传算法 排课系统 编辑:程序博客网 时间:2024/06/05 05:57

居然忘记了高中的组合数公式
在计算组合数取模的过程中很难处理除法。。。
所以要用到C(N,M)=C(N-1,M-1)+C(N-1,M)
从C(1,1)一直递推,就可以避免除法了…
要注意初始化C(i,0)=1;没初始化这个wa了好久…没注意样例都不能过…
在递推求C数组的时候记得取模…
大概的注意事项就这些了吧…
剩下的就是用高中知识解决了…

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>#define mod 1000000007using namespace std;typedef long long LL;int C[550][550];int main(){    memset(C,0,sizeof(C));    for(int i=0;i<=505;i++)    {        C[i][1]=i;        C[i][0]=1;    }    for(int i=2;i<=500;i++)    for(int j=2;j<=i;j++)    {        C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;    }    //freopen("in.txt","r",stdin);    int t;    scanf("%d",&t);    while(t--)    {        LL ans=1;        int i,len,cnt=0;        char s[1050];        scanf("%s",s);        len=strlen(s);        int a[400],b[400],j=0;        memset(a,0,sizeof(a));        for(i=0;i<len;i++)        {            a[s[i]]++;        }        for(i='a';i<='z';i++)        {            if(a[i])            {                b[j++]=a[i]/2;            }            if(a[i]%2!=0)            cnt++;//奇数个字符的个数        }        if(cnt>1)        {            printf("0\n");            continue;        }        int h=len/2;        for(i=0;i<j;i++)        {            ans=(ans*C[h][b[i]])%mod;            h-=b[i];        }        printf("%I64d\n",ans);    }    return 0;}
0 0
原创粉丝点击