超出ll的边界导致输出是负数
样例:
19
aabbbbccccccddddddd
//正确答案:678026453
//我的错误答案:-321973554
个人分析:做法大体正确,但无法避免超出界限,且不知道为什么超出界限了
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e3+10;
const ll Mod=1e9+7;
ll n,ans=1,t[27];
char a[N];
bool l=false;
inline ll A(ll x,ll y){//A(x,y);
ll ret=1;
for(ll i=0;i<y;i++){
ret=(ret*(x-i))%Mod;
}
return ret%Mod;
}
inline ll C(ll x,ll y){
ll ret=1;
for(ll i=0;i<y;i++){
ret=ret*(x-i)/(i+1)%Mod;
}
return ret%Mod;
}
int main()
{
scanf("%lld",&n);scanf("%s",&a);
for(int i=0;i<n;i++) t[a[i]-'a']++;
if(n%2==0){//偶数队列长度
for(int i=0;i<26;i++){
if(t[i]%2==1){printf("%lld\n",A(n,n)%Mod); return 0;}//x/2<1无法分配直接为0
if(t[i]!=0){
ans=ans*C(t[i],t[i]/2)*A(t[i]/2,t[i]/2)%Mod;
}
}
ans=ans*A(n/2,n/2)%Mod;
}else{//奇数队列判断
for(int i=0;i<26;i++){
if(t[i]%2==1&&!l){ans*=(t[i]--)%Mod;l=true;}
if(t[i]%2==1&&l){printf("%lld\n",A(n,n)%Mod); return 0;}//只能有一个奇数
if(t[i]!=0){
ans=ans*C(t[i],t[i]/2)*A(t[i]/2,t[i]/2)%Mod;
}
}
ans=(ans*A((n-1)/2,(n-1)/2))%Mod;
}
printf("%lld\n",(A(n,n)-ans)%Mod);
return 0;
}
悬赏一关注,感谢指点!!!