HDU 5651 xiaoxin juju needs help

组合数杨辉三角打表,这样避免了除法求逆元。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;

const long long MOD=1000000007;
const int maxn=1000+10;
long long c[maxn][maxn];
int tot[30];
char s[maxn];

void init()
{
    c[1][1]=1;
    for(int i=1;i<=1000;i++) c[i][0]=1;
    for(int i=2;i<=1000;i++)
    {
        for(int j=1;j<=1000;j++)
        {
            c[i][j]=(c[i-1][j-1]+c[i-1][j])%MOD;
        }
    }
}

int main()
{
    int T;
    init();
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s",s);
        memset(tot,0,sizeof tot);
        for(int i=0;s[i];i++) tot[s[i]-'a']++;

        int num=0;
        for(int i=0;i<26;i++)
            if(tot[i]%2==1) num++;

        if(num>1) printf("0
");
        else
        {
            int sum=0;
            long long ans=1;
            for(int i=0;i<26;i++) sum=sum+tot[i];
            if(num==1)
            {
                for(int i=0;i<26;i++) if(tot[i]%2==1) tot[i]--;
                sum--;
            }
            for(int i=0;i<26;i++)
            {
                if(tot[i]==0||sum==0) continue;
                ans=(ans*c[sum/2][tot[i]/2])%MOD;
                sum=sum-tot[i];
            }
            printf("%lld
",ans);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5325003.html