求调玄关!!!
查看原帖
求调玄关!!!
1018182
ShaunSH楼主2024/10/7 11:47

逻辑应该没问题,可能是取余的问题

#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;
}
2024/10/7 11:47
加载中...