Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 2016;
- const int MOD = 1e9 + 7;
- const int INV2 = 500000004;
- int n;
- int a[N];
- int C[N][N];
- void _main() {
- for (int i = 0; i < N; ++i) {
- C[i][0] = 1;
- for (int j = 1; j <= i; ++j) {
- C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % MOD;
- }
- }
- int T; cin >> T;
- while (T--) {
- cin >> n;
- for (int i = 0; i < n; ++i) cin >> a[i];
- map<int, int> S;
- for (int i = 0; i < n; ++i) ++S[a[i]];
- int distincts = S.size();
- int repeat = 0;
- for (auto it : S) if (it.second == 2) repeat += 1;
- vector<long long> power (1, 1);
- for (int i = 1; i <= repeat; ++i)
- power.push_back(power.back() * INV2 % MOD);
- vector<long long> fact (1, 1);
- for (int i = 1; i <= n; ++i)
- fact.push_back(fact.back() * i % MOD);
- long long ans = fact[n] * power[repeat] % MOD;
- for (int i = 1; i <= repeat; ++i) {
- int n_pairs = i;
- int remain = n - n_pairs * 2;
- long long first = fact[n_pairs];
- long long second = fact[remain] * power[repeat - n_pairs] % MOD;
- long long cur = first * second % MOD;
- cur = cur * C[n_pairs + remain][n_pairs] % MOD;
- cur = cur * C[repeat][n_pairs] % MOD;
- if (i & 1) {
- ans -= cur;
- } else {
- ans += cur;
- }
- ans %= MOD;
- if (ans < 0) ans += MOD;
- }
- cout << ans << '\n';
- }
- }
- int main() {
- ios::sync_with_stdio(false); cin.tie(NULL);
- _main();
- cerr << setprecision(2) << fixed << endl << "Elapsed " << (double)clock() / CLOCKS_PER_SEC << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement