逻辑应该没问题,可能是取余的问题
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
char c[2005];
long long a1,a2=1,s[27],a3,a4=1;
bool f;
const int mod=1000000007;
long long js(int a){
long long ans=1;
for(int i=1;i<=a;i++){
ans*=i;
ans=ans%(1000000007);
}
return ans;
}
int main(){
scanf("%d\n",&n);
for(int i=1;i<=n;i++){
c[i]=getchar();
s[c[i]-'a'+1]++;
}
a1=js(n);
if(n%2==0){
for(int i=1;i<=26;i++){
if(s[i]%2==0){
a2*=js(s[i]);
a2%=1000000007;
a4*=js(s[i]/2);
a4%=1000000007;
}
else{
printf("%lld",a1);
return 0;
}
}
a3=(a1-a2*js(n/2)/a4)%1000000007;
while(a3<0){
a3+=1000000007;
}
printf("%lld",a3);
}
else{
for(int i=1;i<=26;i++){
if(s[i]%2==0){
a2*=js(s[i]);
a2%=1000000007;
a4*=js(s[i]/2);
a4%=1000000007;
}
else if(!f){
f=1;
a2*=js(s[i]);
a2%=1000000007;
a4*=js(s[i]/2);
a4%=1000000007;
}
else{
printf("%lld",a1);
return 0;
}
}
a3=(a1-a2*js(n/2)/a4)%1000000007;
while(a3<0){
a3+=1000000007;
}
printf("%lld",a3);
}
return 0;
}