求助!!超出边界求调
查看原帖
求助!!超出边界求调
705081
Memory_Lin楼主2022/11/16 21:10

超出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;
}

悬赏一关注,感谢指点!!!

2022/11/16 21:10
加载中...