hdu 5651

来源:互联网 发布:碳微球 知乎 编辑:程序博客网 时间:2024/06/06 05:00
#include <iostream>#include <string.h>using namespace std;typedef __int64 lld;string s;lld T,factor[1010],ans,k,num[550],odd,level;lld  n, m, p;lld Ext_gcd(lld a,lld b,lld &x,lld &y){   if(b==0) { x=1, y=0; return a; }   lld ret= Ext_gcd(b,a%b,y,x);   y-= a/b*x;   return ret;}lld Inv(lld a,int m){   ///求逆元   lld d,x,y,t= (lld)m;   d= Ext_gcd(a,t,x,y);   if(d==1) return (x%t+t)%t;   return -1;}lld Cm(lld n, lld m, lld p)  ///组合数学{    lld a=1, b=1;    if(m>n) return 0;    while(m)    {        a=(a*n)%p;        b=(b*m)%p;        m--;        n--;    }    return (lld)a*Inv(b,p)%p;  ///(a/b)%p 等价于 a*(b,p)的逆元}lld Lucas(lld n, lld m, lld p)  ///把n分段递归求解相乘{    if(m==0) return 1;    return (lld)Cm(n%p,m%p,p)*(lld)Lucas(n/p,m/p,p)%p;}int main(){    cin>>T;    while (T--)    {        cin>>s;        ans=1;        k=0;        odd=0;        level=0;        memset(num,0,sizeof(num));        memset(factor,0,sizeof(factor));        for (int i=0;i<s.length();i++)            num[s[i]-'a']++;        for (int i=0;i<=25;i++)        if (num[i]!=0)        {            if (num[i] % 2 !=0)            {                odd++;                num[i]--;            }            level=level+num[i]/2;            k++;            factor[k]=num[i]/2;        }            if (odd>1)            cout<<0<<endl;            else            {               for (int i=1;i<=k;i++)               {                   ans=(1000000007+ans*Lucas(level,factor[i],1000000007) )%1000000007;                   level=level-factor[i];               }               cout<<ans<<endl;            }    }    retur
0 0
原创粉丝点击