关于此题的O(n^2)解
查看原帖
关于此题的O(n^2)解
1111160
starish楼主2024/10/12 22:03

n!i=025Amp[i]mp[i]Cn/2j=0i1mp[j]/2mp[i]/2n!-\prod_{i=0}^{25}{A_{mp[i]}^{mp[i]}}{C^{mp[i]/2}_{n/2-\sum_{j=0}^{i-1}mp[j]/2}}

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MOD=1e9+7;
int n,ans=1,sum=1,mp[30],c[2024][2024],pd;
int fl(int x){
	int res=1;
	for(int i=1;i<=x;i++)res=res*i%MOD;
	return res;
} 
void init(){
	for(int j=0;j<=2003;j++){
		c[j][j]=c[0][j]=1;
		for(int i=1;i<j;i++){
			c[i][j]=c[i-1][j-1]+c[i][j-1];
			c[i][j]%=MOD;
//			cout<<i<<" "<<j<<" "<<c[i][j]<<"\n";
		}
	}
}
signed main(){
	init();
	cin>>n;
	for(int i=1;i<=n;i++){
		char cha;
		cin>>cha,mp[cha-'a']++;
	}
	for(int i=1;i<=n;i++){
		ans=ans*i%MOD;
	}
	for(int i=0;i<=25;i++){
		if(mp[i]%2)pd++;
	}
	if(pd>=2||(n%2==0&&pd==1)){
		cout<<ans<<"\n";
	}
	else{
		int sum=1,cj=n/2;
		for(int i=0;i<=25;i++){
			sum=sum*c[mp[i]/2][cj]%MOD*fl(mp[i])%MOD;
			cj-=(mp[i]/2);
		}
		cout<<(ans-sum+MOD)%MOD;
	}
	return 0;
}
2024/10/12 22:03
加载中...