xiaoxin juju needs help
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2052 Accepted Submission(s): 635
Problem Description
As we all known, xiaoxin is a brilliant coder. He knew **palindromic** strings when he was only a six grade student at elementry school.
This summer he was working at Tencent as an intern. One day his leader came to ask xiaoxin for help. His leader gave him a string and he wanted xiaoxin to generate palindromic strings for him. Once xiaoxin generates a different palindromic string, his leader will give him a watermelon candy. The problem is how many candies xiaoxin's leader needs to buy?
This summer he was working at Tencent as an intern. One day his leader came to ask xiaoxin for help. His leader gave him a string and he wanted xiaoxin to generate palindromic strings for him. Once xiaoxin generates a different palindromic string, his leader will give him a watermelon candy. The problem is how many candies xiaoxin's leader needs to buy?
Input
This problem has multi test cases. First line contains a single integer
T(T≤20)
which represents the number of test cases.
For each test case, there is a single line containing a string S(1≤length(S)≤1,000)
.
For each test case, there is a single line containing a string S(1≤length(S)≤1,000)
Output
For each test case, print an integer which is the number of watermelon candies xiaoxin's leader needs to buy after mod
1,000,000,007
.
Sample Input
3 aa aabb a
Sample Output
1 2 1/* 题意是要求一个只含有小写字母的字符串,能组成多少不同的 回文串,先判断能否组成回文串, 若能,则取字符串长度num=len/2,得到有多少对, 在根据公式num!/((a[i]/2)!)%(1e9+7)求解, 除法取模,要用到扩展欧几里得求逆元 即(a/b)%c=(a%c)*(b^(c-2))%c, 这里就是(num!)%m*(((a[i]/2)!)^(m-2))%m, 中间用到一个快速幂即可。 */ #include #include #include using namespace std; long long fib(int x) //求连乘 { long long ans=1; for(int i=1;i<=x;i++) { ans*=i; ans%=1000000007; } return ans; } int main() { int T; scanf("%d",&T); while(T--) { char s[20050]; int b[20050]; int a[26]; scanf("%s",s); int len; len=strlen(s); memset(a,0,sizeof(a)); for(int i=0;i 1) break; if(a[i]>0) num+=a[i]/2; } if(flag<=1) { ans=fib(num); for(int i=0;i<26;i++) { if(a[i]>0) { long long x=a[i]/2; x=fib(x); long long sum=1; //快速幂,习惯这样写。。 long long a=x; long long b=1000000005; //开始居然多打了一个0,坑死了。。 long long c=1000000007; a=a%c; while(b>0) { if(b%2==1) sum=(sum*a)%c; b=b/2; a=(a*a)%c; } ans=ans*sum%(1000000007); } } } if(flag>1) printf("0\n"); else printf("%d\n",ans); } return 0; }