思路就是第一篇题解的思路,处理出阶乘和逆元,然后用公式计算,然而不知道哪错了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int N = 2e3 + 10;
const int mod = 1e9 + 7;
int n, cnt[26];
long long jc[N], ny[N];
long long qpow(long long b, long long p){
if(p == 0)
return 1;
long long x = 1;
for(; p; b *= b, b %= mod, p >>= 1)
if(p & 1)
x = x * b % mod;
return x;
}
int js(){
int num = 0;
for(int i = 0; i < 26; i++)
if(cnt[i] % 2 == 1)
num++;
return num;
}
int main(){
jc[0] = 1;
cin >> n;
for(int i = 1; i <= n; i++){
char ch;
cin >> ch;
cnt[ch - 'a']++;
jc[i] = jc[i-1] * i;
}
//for(int i = 0; i < 26; i++)
// printf("%c: %d\n", 'a' + i, cnt[i]);
ny[n] = qpow(jc[n], mod - 2);
for(int i = n - 1; i >= 0; i--)
ny[i] = ny[i + 1] * (i + 1) % mod;
if(js() > 1){
cout << jc[n] << endl;
return 0;
}
int odd = 1;
for(int i = 0; i < 26; i++)
if(cnt[i] % 2 == 1)
odd = cnt[i];
//所有cnt都为偶数时odd=1
long long tans = jc[n / 2] * odd % mod;
for(int i = 0; i < 26; i++)
tans = tans * jc[cnt[i]] % mod * ny[cnt[i] / 2] % mod;
cout << (jc[n] - tans + mod) % mod << endl;
return 0;
}