```C++
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define lll __int128
#define pb emplace_back
#define INF_INT 2e9
#define INF_LLONG 1e18
#define INF_INT_MEMSET_SMALL 0x3f3f3f3f
#define INF_INT_MEMSET_BIG 0x7f7f7f7f
using namespace std;
const ll Mod = 1e9 + 7;
const ll N = 2005;
ll n;
ll total;
char s[N];
ll A[N][N], C[N][N];
ll cnt[N];
void init()
{
A[0][0] = 1;
for (ll i = 1; i <= n; i++) {
A[i][0] = 1;
for (ll j = 1; j <= i; j++) {
A[i][j] = A[i][j - 1] * j % Mod;
}
}
/*
for (ll i = 1; i <= n; i++) {
for (ll j = 1; j <= i; j++) {
cout << A[i][j] << " ";
}
cout << endl;
}
*/
for (ll i = 0; i <= n; i++) {
for (ll j = 0; j <= n; j++) {
if (j == 0 || i == j)
C[i][j] = 1;
else
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % Mod;
}
}
for (ll i = 1; i <= n; i++) {
cnt[(ll)s[i]]++;
}
/*
for (ll i = 1; i <= n; i++) {
cout << s[i] << " : " << cnt[(ll)s[i]] << "\n";
}
*/
}
void work()
{
cin >> n;
cin >> (s + 1);
init();
/*
for (ll i = 1; i <= n; i++)
cout << s[i];
*/
total = A[n][n];
ll tn = n / 2;
ll tmp = 1, x = 0;
for (char i = 'a'; i <= 'z'; i++) {
if (cnt[(ll)i]) {
x += (cnt[(ll)i] % 2);
ll cur = cnt[(ll)i] / 2;
tmp = tmp * C[tn][cur] % Mod * A[cnt[(ll)i]][cnt[(ll)i]] % Mod;
tn -= cur;
}
}
if (x > 1) {
cout << total % Mod;
} else {
cout << ((total - tmp) + Mod) % Mod;
}
return;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
work();
return 0;
}
```
过了,警示后人,小心取模的问题
by haoyijie @ 2024-07-28 22:16:59