Task: | Kortit II |
Sender: | jokeri2222 |
Submission time: | 2024-11-06 12:09:07 +0200 |
Language: | C++ (C++11) |
Status: | READY |
Result: | 8 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 3 |
#2 | ACCEPTED | 5 |
#3 | TIME LIMIT EXCEEDED | 0 |
#4 | TIME LIMIT EXCEEDED | 0 |
#5 | TIME LIMIT EXCEEDED | 0 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | ACCEPTED | 0.00 s | 1, 2, 3, 4, 5 | details |
#2 | ACCEPTED | 0.04 s | 2, 3, 4, 5 | details |
#3 | TIME LIMIT EXCEEDED | -- | 3, 4, 5 | details |
#4 | TIME LIMIT EXCEEDED | -- | 4, 5 | details |
#5 | TIME LIMIT EXCEEDED | -- | 5 | details |
#6 | WRONG ANSWER | 0.05 s | 5 | details |
Code
#include <iostream> #include <vector> #include <algorithm> #include <map> #include <iterator> #include <iomanip> #include <list> #include <numeric> using namespace std; int mod_factorial(int n) { long long result = 1; for (int i = 2; i <= n; ++i) { result = (result * i) % 1000000007; } return result; } long long factorial(int n) { long long result = 1; for (int i = 2; i <= n; ++i) { result *= i; } return result; } long long nCr(int n, int k) { long long result = mod_factorial(n)/(mod_factorial(k)*mod_factorial(n-k)); return result; } vector<int> ith_permutation(const vector<int>& l, int i) { int n = l.size(); vector<long long> fact(n, 1); vector<int> perm(n, 0); for (int k = 1; k < n; ++k) { fact[k] = fact[k - 1] * k; } for (int k = 0; k < n; ++k) { perm[k] = i / fact[n - 1 - k]; i = i % fact[n - 1 - k]; } for (int k = n - 1; k > 0; --k) { for (int j = k - 1; j >= 0; --j) { if (perm[j] <= perm[k]) { perm[k]++; } } } vector<int> result; for (int x : perm) { result.push_back(l[x]); } return result; } int main() { int t; cin >> t; vector<vector<int>> vals(t); for (int test = 0; test < t; ++test) { int n, a, b; cin >> n >> a >> b; vals[test] = {n, a, b}; } for (const auto& test : vals) { int n = test[0], a = test[1], b = test[2]; if (a + b == 1 || a + b > n) { cout << 0 << endl; continue; } if (a+b==0) { cout << mod_factorial(n) << "\n"; continue; } if (b>a) { int temp=a; a=b; b=temp; } int possibles = 0; int apb = a + b; int c = n-apb; int _fac = factorial(apb) - 1; vector<int> draws(n - apb); iota(draws.begin(), draws.end(), apb); vector<int> pairs(n); iota(pairs.begin(), pairs.end(), 0); sort(draws.rbegin(), draws.rend()); for (int draw : draws) { pairs.erase(pairs.begin() + draw); } int i = _fac; while (i >= 0) { vector<int> perm = ith_permutation(pairs, i); int A = 0, B = 0, C = 0; for (int j = 0; j < apb; j++) { if (perm[j] < pairs[j]) { A++; } else if (perm[j] > pairs[j]) { B++; } else { C++; } if (A > a || B > b || C > c || (A <= a && B <= b && j == apb - 1)) { i -= factorial(apb - j - 1); break; } } if (A == a && B == b) { possibles++; } } possibles = (((possibles * mod_factorial(n)) % 1000000007) * nCr(n, c)) % 1000000007; cout << possibles << "\n"; } return 0; }
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: TIME LIMIT EXCEEDED
input |
---|
841 19 3 12 19 19 13 19 7 13 20 11 15 ... |
correct output |
---|
40291066 0 0 0 0 ... |
user output |
---|
(empty) |
Test 4
Group: 4, 5
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 15 12 6 7 1 6 44 4 26 6 6 5 ... |
correct output |
---|
0 5040 494558320 0 340694548 ... |
user output |
---|
(empty) |
Test 5
Group: 5
Verdict: TIME LIMIT EXCEEDED
input |
---|
1000 892 638 599 966 429 655 1353 576 1140 1403 381 910 ... |
correct output |
---|
0 0 0 249098285 0 ... |
user output |
---|
(empty) |
Test 6
Group: 5
Verdict: WRONG ANSWER
input |
---|
1000 2000 1107 508 2000 1372 249 2000 588 65 2000 1739 78 ... |
correct output |
---|
750840601 678722180 744501884 159164549 868115056 ... |
user output |
---|
0 0 0 0 0 ... |