今天又是遇到了同样的毛病,我看着别人的代码去打,结果依旧不能得到正确的答案。一度很着急。对于这个问题,我后来想到的办法是,把别人的代码按照自己的理解和习惯,先整理几边,交交看,然后再自己写一遍加深印象。不要识图完全模仿了。
这道题的在比赛的时候,是我的数学能力不够,没想到组合数联乘的做法。有些失落。现在理解了,k个里取ai个位置进行组合,然后再在k-ai中取ai+1个位置进行组合以此类推,得到多种多个对象组合的数量。
#include<cstdio>
#include<cstring>
#define MOD 1000000007
typedef long long ll;
int a[30];
ll comb[505][505];
char s[1005];
int main()
{
memset(comb,0,sizeof(comb));
comb[0][0]=1;
for(int i=1;i<=501;i++)
comb[i][0]=1;
for(int i=1;i<=501;i++)
for(int j=1;j<=i;j++)
comb[i][j]=(comb[i-1][j]+comb[i-1][j-1])%MOD;
//组合数,杨辉三角表打得不熟练
int T;
scanf("%d",&T);
while(T--)
{
memset(a,0,sizeof(a));
scanf("%s",s);
int l=strlen(s);
if(l==1){printf("1\n");continue;}
for(int i=0;i<l;i++)
a[s[i]-'a'+1]++;
int flag=0;
for(int i=1;i<=26;i++){
if(a[i]&1)flag++;
a[i]/=2;
}
if(flag>1){printf("0\n");continue;}
ll ans=1;
for(int k=l/2,i=1;i<=26;i++){
ans=(ans*comb[k][a[i]])%MOD;
k-=a[i];
//这一步还是数学办法没想到
}
printf("%lld\n",ans);
}
return 0;
}
希望自己能赶快进入到更高效的做题状态!