CSES - Datatähti 2025 alku - Results
Submission details
Task:Kortit II
Sender:Hattless
Submission time:2024-10-31 13:56:54 +0200
Language:C++ (C++17)
Status:READY
Result:3
Feedback
groupverdictscore
#1ACCEPTED3
#20
#30
#40
#50
Test results
testverdicttimegroup
#1ACCEPTED0.00 s1, 2, 3, 4, 5details
#20.01 s2, 3, 4, 5details
#3--3, 4, 5details
#40.00 s4, 5details
#50.42 s5details
#60.42 s5details

Code

#include <bits/stdc++.h>
#define ln "\n"
using namespace std;
using ll = long long;
int MOD = 1e9+7;
ll getMul(ll a,ll b) {
    ll n = a+b;
    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][state]) % MOD;
                    dp[mask | (1 << i)][newState] %= MOD;
                } else if (num < winCount + 1 && l + 1 <= b) {
                    ll newState = w*(b+1) +(l+1);
                    dp[mask | (1 << i)][newState] += (dp[mask][state]) % MOD;
                    dp[mask | (1 << i)][newState] %= MOD;
                }
            }
        }
    }
    ll totalWays = 0;
    int target = a*(b+1)+b;
    for (int mask = 0; mask < limit; mask++) {
        totalWays += dp[mask][target];
    }
    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;
            }
            ll diver = 1;
            ll j = 1;
            for(ll i = c+1; i <= n; i++) {
               finalMul = (finalMul * i) % MOD;
               finalMul = (finalMul * i) % MOD;
               diver = (diver * j) % MOD;
               j++;
            }
            finalMul /= diver;
            ll ans = (finalMul*variations) % MOD;
            cout << ans << 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:

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:

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:

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

Error:
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

Test 5

Group: 5

Verdict:

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:

input
1000
2000 1107 508
2000 1372 249
2000 588 65
2000 1739 78
...

correct output
750840601
678722180
744501884
159164549
868115056
...

user output
(empty)