Task: | Kortit II |
Sender: | Hattless |
Submission time: | 2024-11-09 20:00:50 +0200 |
Language: | C++ (C++17) |
Status: | READY |
Result: | 34 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 3 |
#2 | ACCEPTED | 5 |
#3 | ACCEPTED | 26 |
#4 | RUNTIME ERROR | 0 |
#5 | RUNTIME ERROR | 0 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | ACCEPTED | 0.00 s | 1, 2, 3, 4, 5 | details |
#2 | ACCEPTED | 0.01 s | 2, 3, 4, 5 | details |
#3 | ACCEPTED | 0.01 s | 3, 4, 5 | details |
#4 | RUNTIME ERROR | 0.00 s | 4, 5 | details |
#5 | RUNTIME ERROR | 0.00 s | 5 | details |
#6 | RUNTIME ERROR | 0.00 s | 5 | details |
Code
#include <bits/stdc++.h>#define ln "\n"using namespace std;using ll = long long;int MOD = 1e9+7;ll modExp(ll base, ll exp, int mod) {ll result = 1;while (exp > 0) {if (exp % 2 == 1) {result = (result * base) % mod;}base = (base * base) % mod;exp /= 2;}return result;}ll getMul(ll a, ll b) {ll n = a + b;if(n > 8) {vector<vector<ll>> dpv(20, vector<ll> (20,0));if(b > a) swap(a,b);// 20dpv[19][1] = 1;dpv[18][2] = 1048535;dpv[17][3] = 454279324;dpv[16][4] = 523632634;dpv[15][5] = 385470287;dpv[14][6] = 871449594;dpv[13][7] = 530109088;dpv[12][8] = 285082030;dpv[11][9] = 65680015;dpv[10][10] = 694296779;// 19dpv[18][1] = 1;dpv[17][2] = 524249;dpv[16][3] = 146795686;dpv[15][4] = 488340185;dpv[14][5] = 113217428;dpv[13][6] = 143784997;dpv[12][7] = 897051207;dpv[11][8] = 405967908;dpv[10][9] = 427513351;// 18dpv[17][1] = 1;dpv[16][2] = 262107;dpv[15][3] = 380081105;dpv[14][4] = 131277918;dpv[13][5] = 653878722;dpv[12][6] = 283239251;dpv[11][7] = 224880232;dpv[10][8] = 776442791;dpv[9][9] = 744422627;// 17dpv[16][1] = 1;dpv[15][2] = 131037;dpv[14][3] = 125667333;dpv[13][4] = 166996279;dpv[12][5] = 496884791;dpv[11][6] = 51334367;dpv[10][7] = 873374622;dpv[9][8] = 331293441;// 16dpv[15][1] = 1;dpv[14][2] = 65503;dpv[13][3] = 41408833;dpv[12][4] = 352853130;dpv[11][5] = 353683273;dpv[10][6] = 443916467;dpv[9][7] = 23079360;dpv[8][8] = 634184753;// 15dpv[14][1] = 1;dpv[13][2] = 32737;dpv[12][3] = 13579309;dpv[11][4] = 780889437;dpv[10][5] = 218582477;dpv[9][6] = 767040909;dpv[8][7] = 753131331;// 14dpv[13][1] = 1;dpv[12][2] = 16355;dpv[11][3] = 4422913;dpv[10][4] = 178065811;dpv[9][5] = 977056426;dpv[8][6] = 789852802;dpv[7][7] = 172272237;// 13dpv[12][1] = 1;dpv[11][2] = 8165;dpv[10][3] = 1426725;dpv[9][4] = 39474449;dpv[8][5] = 302458313;dpv[7][6] = 802028813;// 12dpv[11][1] = 1;dpv[10][2] = 4071;dpv[9][3] = 453905;dpv[8][4] = 8422679;dpv[7][5] = 42924113;dpv[6][6] = 72605303;// 11dpv[10][1] = 1;dpv[9][2] = 2025;dpv[8][3] = 141549;dpv[7][4] = 1704693;dpv[6][5] = 5494017;// 10dpv[9][1] = 1;dpv[8][2] = 1003;dpv[7][3] = 42865;dpv[6][4] = 320107;dpv[5][5] = 607009;// 9dpv[8][1] = 1;dpv[7][2] = 493;dpv[6][3] = 12421;dpv[5][4] = 53833;return dpv[a][b];} else {ll limit = (1LL << n), maxState = (a + 1) * (b + 1);vector<vector<ll>> dp(limit, vector<ll>(maxState, 0));dp[0][0] = 1;for (int mask = 0; mask < limit; mask++) {int winCount = __builtin_popcount(mask);for (int i = 0; i < n; i++) {if (mask & (1 << i)) continue;int num = i + 1;for (int state = 0; state < maxState; state++) {if (dp[mask][state] == 0) continue;ll w = state / (b + 1);ll l = state % (b + 1);if (num > winCount + 1 && w + 1 <= a) {ll newState = (w + 1) * (b + 1) + l;dp[mask | (1 << i)][newState] = (dp[mask | (1 << i)][newState] + dp[mask][state]) % MOD;} else if (num < winCount + 1 && l + 1 <= b) {ll newState = w * (b + 1) + (l + 1);dp[mask | (1 << i)][newState] = (dp[mask | (1 << i)][newState] + dp[mask][state]) % MOD;}}}}ll totalWays = 0;int target = a * (b + 1) + b;for (int mask = 0; mask < limit; mask++) {totalWays = (totalWays + dp[mask][target]) % MOD;}return totalWays;}}int main() {int t;cin >> t;while (t--) {int n, a, b;cin >> n >> a >> b;if ((a == 0 && b != 0) || (a != 0 && b == 0) || (a + b > n)) {cout << 0 << ln;} else {ll variations = getMul(a, b);ll c = a + b;ll finalMul = 1;for (ll i = 1; i <= c; i++) {finalMul = (finalMul * i) % MOD;}for (ll i = c + 1; i <= n; i++) {finalMul = (finalMul * i) % MOD;finalMul = (finalMul * i) % MOD;}ll diver = 1;for (ll j = 1; j <= (n - c); j++) {diver = (diver * j) % MOD;}ll diverInv = modExp(diver, MOD - 2, MOD);finalMul = (finalMul * variations) % MOD;finalMul = (finalMul * diverInv) % MOD;cout << finalMul << ln;}}}
Test details
Test 1
Group: 1, 2, 3, 4, 5
Verdict: ACCEPTED
input |
---|
54 4 4 0 3 1 3 3 2 2 4 0 4 ... |
correct output |
---|
0 0 0 0 0 ... |
user output |
---|
0 0 0 0 0 ... |
Test 2
Group: 2, 3, 4, 5
Verdict: ACCEPTED
input |
---|
284 6 1 0 5 0 2 7 1 5 7 7 5 ... |
correct output |
---|
0 0 35280 0 36720 ... |
user output |
---|
0 0 35280 0 36720 ... |
Test 3
Group: 3, 4, 5
Verdict: ACCEPTED
input |
---|
841 19 3 12 19 19 13 19 7 13 20 11 15 ... |
correct output |
---|
40291066 0 0 0 0 ... |
user output |
---|
40291066 0 0 0 0 ... |
Test 4
Group: 4, 5
Verdict: RUNTIME ERROR
input |
---|
1000 15 12 6 7 1 6 44 4 26 6 6 5 ... |
correct output |
---|
0 5040 494558320 0 340694548 ... |
user output |
---|
0 5040 |
Test 5
Group: 5
Verdict: RUNTIME ERROR
input |
---|
1000 892 638 599 966 429 655 1353 576 1140 1403 381 910 ... |
correct output |
---|
0 0 0 249098285 0 ... |
user output |
---|
0 0 0 |
Test 6
Group: 5
Verdict: RUNTIME ERROR
input |
---|
1000 2000 1107 508 2000 1372 249 2000 588 65 2000 1739 78 ... |
correct output |
---|
750840601 678722180 744501884 159164549 868115056 ... |
user output |
---|
(empty) |