学组合数不久,对二项式定理的熟悉程度还是太低了。
这是一个经典的球与袋问题。求将n种球放在m个袋子里的方法。
∑
n
u
m
[
i
]
=
m
\sum_{num[i]}=m
∑num[i]=m
根据二项式可以推理,首先若球全部不同,即有
m
!
m!
m!种方法,除去有球相同的情况只需
m
!
/
n
u
m
[
i
]
!
m!/num[i]!
m!/num[i]!。
#include <bits/stdc++.h>
using namespace std;
#define int long long
int num[30];
const int MOD = 1e9 + 7;
long long quickmul(int a, int b) {
long long ret = 1;
for (; b; b >>= 1, a = (long long) a * a % MOD)
if ((b & 1))
ret = ret * a % MOD;
return ret;
}
void solve() {
int T;
cin >> T;
while (T--) {
memset(num, 0, sizeof num);
string s;
cin >> s;
int ji = 0;
for (int i = 0; i < s.length(); ++i) {
num[s[i] - 'a']++;
}
int tot = 0;
for (int i = 0; i <= 25; ++i) {
if (num[i] & 1) {
num[i] -= 1;
ji++;
}
tot += num[i] / 2;
}
if (ji > 1) cout << 0 << endl;
else {
int ans = 1;
for (int i = 1; i <= tot; ++i) {
(ans *= i) %= MOD;
}
for (int i = 0; i <= 25; ++i) {
for (int j = 1; j <= num[i]/2; ++j) {
ans = ans * quickmul(j,MOD-2)%MOD;
}
}
cout << ans << endl;
}
}
}
signed main() {
ios::sync_with_stdio(0);
// freopen("in.txt", "r", stdin);
solve();
}