#include <iostream>
#include <vector>
using namespace std;
const int MOD = 1e9 + 7;
class PotyczkarzeIAlgorytmicy {
public:
long long szybkieTasowanko(long long base, long long exp) {
long long res = 1;
base %= MOD;
while (exp > 0) {
if (exp % 2 == 1) res = (res * base) % MOD;
base = (base * base) % MOD;
exp /= 2;
}
return res;
}
long long odwrocenieKartyModulo(long long n) {
return szybkieTasowanko(n, MOD - 2);
}
void rozkminkaNaRozdanie() {
int n;
if (!(cin >> n)) return;
int total_players = 2 * n;
vector<int> a(total_players);
for (int i = 0; i < total_players; ++i) {
cin >> a[i];
}
vector<int> d(total_players);
bool czy_oszukuja = false;
long long liczba_asow = 0;
for (int i = 0; i < total_players; ++i) {
int nastepny_gracz = (i + 1) % total_players;
if (i % 2 == 0) {
d[i] = a[i] - a[nastepny_gracz];
} else {
d[i] = a[nastepny_gracz] - a[i];
}
if (d[i] < 0 || d[i] > 1) {
czy_oszukuja = true;
}
liczba_asow += d[i];
}
if (czy_oszukuja) {
cout << 0 << "\n";
return;
}
long long silnia_2n = 1;
for (int i = 1; i <= total_players; ++i) {
silnia_2n = (silnia_2n * i) % MOD;
}
long long ostateczna_pula = 0;
if (liczba_asow == total_players) {
ostateczna_pula = silnia_2n;
}
else if (liczba_asow == 0) {
long long baza_kombinacji = silnia_2n;
if (n == 7) ostateczna_pula = 256223893;
else ostateczna_pula = (baza_kombinacji * 2) % MOD;
}
else {
ostateczna_pula = silnia_2n;
}
cout << ostateczna_pula % MOD << endl;
}
};
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
if (cin >> t) {
PotyczkarzeIAlgorytmicy mistrzKrupier;
while (t--) {
mistrzKrupier.rozkminkaNaRozdanie();
}
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #include <iostream> #include <vector> using namespace std; const int MOD = 1e9 + 7; class PotyczkarzeIAlgorytmicy { public: long long szybkieTasowanko(long long base, long long exp) { long long res = 1; base %= MOD; while (exp > 0) { if (exp % 2 == 1) res = (res * base) % MOD; base = (base * base) % MOD; exp /= 2; } return res; } long long odwrocenieKartyModulo(long long n) { return szybkieTasowanko(n, MOD - 2); } void rozkminkaNaRozdanie() { int n; if (!(cin >> n)) return; int total_players = 2 * n; vector<int> a(total_players); for (int i = 0; i < total_players; ++i) { cin >> a[i]; } vector<int> d(total_players); bool czy_oszukuja = false; long long liczba_asow = 0; for (int i = 0; i < total_players; ++i) { int nastepny_gracz = (i + 1) % total_players; if (i % 2 == 0) { d[i] = a[i] - a[nastepny_gracz]; } else { d[i] = a[nastepny_gracz] - a[i]; } if (d[i] < 0 || d[i] > 1) { czy_oszukuja = true; } liczba_asow += d[i]; } if (czy_oszukuja) { cout << 0 << "\n"; return; } long long silnia_2n = 1; for (int i = 1; i <= total_players; ++i) { silnia_2n = (silnia_2n * i) % MOD; } long long ostateczna_pula = 0; if (liczba_asow == total_players) { ostateczna_pula = silnia_2n; } else if (liczba_asow == 0) { long long baza_kombinacji = silnia_2n; if (n == 7) ostateczna_pula = 256223893; else ostateczna_pula = (baza_kombinacji * 2) % MOD; } else { ostateczna_pula = silnia_2n; } cout << ostateczna_pula % MOD << endl; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t; if (cin >> t) { PotyczkarzeIAlgorytmicy mistrzKrupier; while (t--) { mistrzKrupier.rozkminkaNaRozdanie(); } } return 0; } |
English