您的位置:首页 > 其它

HDU 5651 xiaoxin juju needs help 逆元

2016-05-24 10:12 323 查看
xiaoxin juju needs help
Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d &

%I64u
Submit

Status
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?

Input
This problem has multi test cases. First line contains a single integer T(T\leq 20) which

represents the number of test cases.
For each test case, there is a single line containing a string S(1 \leq length(S) \leq

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

Source
BestCoder Round #77 (div.2)

给你n个字母,求可以组成的回文串的个数
1.n为奇数,有一个字母的个数为奇数
2.n为偶数,字母个数全为偶数

然后将字母的个数num[i]/2,得出在对称轴左边的个项字母的个数
假设左边有len个字母,如果每个字母都不同则有len!中可能
然后除去所有重复的可能num[i]!即可
因为除法取模 (len!/num[i]!)%mod
a^(p-1) = 1(mod p)p为素数 于是 a*a^(p-2) = 1(mod p)所以a^(p-2)替代1/a.
所以上面的公式 -> len!*(num[i]!)^(p-2)%mod

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define mod 1000000007
using 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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: