CSES - Datatähti 2025 alku - Results
Submission details
Task:Kortit II
Sender:Sukarth
Submission time:2024-11-10 15:42:10 +0200
Language:C++ (C++11)
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
#30
#40
#50
Test results
testverdicttimegroup
#10.00 s1, 2, 3, 4, 5details
#20.00 s2, 3, 4, 5details
#30.01 s3, 4, 5details
#40.01 s4, 5details
#50.10 s5details
#60.32 s5details

Code

#include <iostream>
#include <vector>

using namespace std;

const int MOD = 1e9 + 7;

// Function to compute factorial modulo MOD
vector<long long> compute_factorials(int max_n)
{
    vector<long long> fact(max_n + 1);
    fact[0] = 1;
    for (int i = 1; i <= max_n; ++i)
    {
        fact[i] = (fact[i - 1] * i) % MOD;
    }
    return fact;
}

// Function to compute modular inverse using Fermat's Little Theorem
long long mod_inverse(long long a)
{
    long long res = 1, exp = MOD - 2; // a^(MOD-2) % MOD
    while (exp > 0)
    {
        if (exp % 2 == 1)
        {
            res = (res * a) % MOD;
        }
        a = (a * a) % MOD;
        exp /= 2;
    }
    return res;
}

// Function to compute nCr % MOD
long long nCr(int n, int r, const vector<long long> &fact)
{
    if (r > n || r < 0)
        return 0;
    return (fact[n] * mod_inverse(fact[r]) % MOD * mod_inverse(fact[n - r]) % MOD) % MOD;
}

// Main function to count valid game configurations
long long count_games(int n, int target_a, int target_b, const vector<long long> &fact)
{
    if (target_a + target_b > n)
        return 0; // Not enough cards for wins

    long long total_ways = 0;

    // Iterate over all possible distributions of ties
    for (int ties = 0; ties <= n - target_a - target_b; ++ties)
    {
        // Calculate combinations for player A's wins and player B's wins
        long long ways_a = nCr(n, target_a, fact);
        long long ways_b = nCr(n - target_a, target_b, fact); // Remaining cards for player B

        // Multiply by the arrangements of ties
        total_ways = (total_ways + ways_a * ways_b % MOD * fact[ties] % MOD) % MOD;
    }

    return total_ways;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;

    const int MAX_N = 2000;
    vector<long long> fact = compute_factorials(MAX_N);

    while (t--)
    {
        int n, a, b;
        cin >> n >> a >> b;

        long long result = count_games(n, a, b, fact);
        cout << result << '\n';
    }

    return 0;
}

Test details

Test 1

Group: 1, 2, 3, 4, 5

Verdict:

input
54
4 4 0
3 1 3
3 2 2
4 0 4
...

correct output
0
0
0
0
0
...

user output
1
0
0
1
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
924
100
84
0
15
...

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
59961720
0
0
0
0
...

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
7
819286225
0
880769924
...

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
931771626
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
411573534
711256252
345740074
184746458
359293586
...