题目链接:
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 491 Accepted Submission(s): 142
#include <iostream> #include <cstdio> #include <queue> #include <cstring> #include <algorithm> using namespace std; const int mod=1e9+7; char str[1010]; int a[27],b[1010]; int gcd(int x,int y) { if(y==0)return x; return gcd(y,x%y); } queue<int>qu; int main() { int t; scanf("%d",&t); while(t--) { while(!qu.empty())qu.pop(); memset(a,0,sizeof(a)); scanf("%s",str); int len=strlen(str); for(int i=0;i<len;i++) { a[str[i]-‘a‘]++; } int flag=0; long long ans=1; for(int i=0;i<26;i++) { if(a[i]%2) { flag++; } a[i]=a[i]/2; } for(int i=1;i<=len/2;i++) { b[i]=(long long)i; } //memset(vis,0,sizeof(vis)); for(int i=0;i<26;i++) { if(a[i]>1) { for(int j=2;j<=a[i];j++) { qu.push(j); } } } while(!qu.empty()) { int x=qu.front(); qu.pop(); for(int i=2;i<=len/2;i++) { if(b[i]%x==0) { b[i]/=x; break; } else { int y=gcd(b[i],x); if(y>1) { b[i]/=y; x/=y; if(x>1)qu.push(x); break; } } } } for(int j=1;j<=len/2;j++) { ans*=(long long)b[j]; ans%=mod; } if(flag>1)cout<<"0"<<"\n"; else cout<<ans<<"\n"; } return 0; }
hdu-5651 xiaoxin juju needs help(数学+gcd约分求阶乘)
原文:http://www.cnblogs.com/zhangchengc919/p/5324636.html