Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int MAXN = 2010;
- const int mod = 1000000007;
- int memo[MAXN][MAXN][2];
- int bt(int a, int b, bool last) {
- if (a < 0 || b < 0) return 0;
- if (a == 0 && b == 0) return 1;
- if (memo[a][b][last] != -1) return memo[a][b][last];
- int &ret = memo[a][b][last];
- ret = 0;
- if (last) {
- ret += (1LL * (b - 1) * bt(a, b - 1, false) + 1LL * a * bt(a - 1, b + 1, true)) % mod;
- ret %= mod;
- }
- else {
- ret += (1LL * a * bt(a - 1, b + 1, true) + 1LL * b * bt(a, b - 1, false)) % mod;
- ret %= mod;
- }
- return ret;
- }
- int main() {
- memset(memo, -1, sizeof memo);
- int q;
- scanf("%d", &q);
- while (q--) {
- int n;
- scanf("%d", &n);
- int a = 0, b = 0;
- set<int> st;
- for (int i = 0; i < n; i++) {
- int x;
- scanf("%d", &x);
- if (st.count(x)) {
- a++;
- }
- else {
- st.insert(x);
- }
- }
- b = n - 2 * a;
- int ans = 1LL * bt(a, b, false);
- printf("%d\n", ans);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement