CSES - Datatähti 2025 alku - Results
Submission details
Task:Kortit II
Sender:adex720
Submission time:2024-11-01 23:47:58 +0200
Language:C++ (C++20)
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
#30
#40
#50
Test results
testverdicttimegroup
#10.00 s1, 2, 3, 4, 5details
#20.01 s2, 3, 4, 5details
#3--3, 4, 5details
#4--4, 5details
#5--5details
#6--5details

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:124:17: warning: unused variable 'nytMahdollisa' [-Wunused-variable]
  124 |             int nytMahdollisa = 0;
      |                 ^~~~~~~~~~~~~

Code

#include <bits/stdc++.h>
using namespace std;

int mod = 1e9 + 7;

long long binomikerroin(int n, int k)
{
    if (k > (n >> 1))
        return binomikerroin(n, n - k);

    long long summa = 1;
    while (k > 0)
    {
        summa = (summa * n) % mod;
        n--;
        k--;
    }

    return summa;
}

set<vector<int>> luoLista(vector<int> perusta, int n, int lisayksia, int eka)
{
    set<vector<int>> listat;

    if (eka == 0 && lisayksia == 1)
    {
        vector<int> v = vector<int>(perusta);
        v[0] = 1;
        v[2 * n - 1] = 1;
        listat.insert(v);
        return listat;
    }

    for (int i = eka; i < (eka == 0 ? 1 : n - lisayksia + 1); i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            if (perusta[n + j] == 1)
                continue;

            vector<int> alku = vector<int>(perusta);
            alku[i] = 1;
            alku[n + j] = 1;

            if (lisayksia == 1)
            {
                listat.insert(alku);
                continue;
            }

            for (vector<int> v : luoLista(alku, n, lisayksia - 1, i + 1))
            {
                if (i > 0 || (v[2 * n - 1] == 1))
                    listat.insert(v);
            }
        }
    }

    return listat;
}

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

    int t, n, a, b, c;
    cin >> t;

    int kertomat[2001];
    kertomat[1] = 1;

    for (long long i = 2; i <= 2000; i++)
    {
        kertomat[i] = (kertomat[i - 1] * i) % mod;
    }

    for (int i = 0; i < t; i++)
    {
        cin >> n >> a >> b;
        int voittoja = a + b;

        if (voittoja < 0 || voittoja > n || (a == 0) ^ (b == 0))
        {
            cout << "0\n";
            continue;
        }

        if (voittoja == 0)
        {
            cout << kertomat[n] << "\n";
            continue;
        }

        int tasapeleja = binomikerroin(n, n - voittoja);

        if (a > b)
        {
            c = b;
            b = a;
            a = c;
        }

        vector<int> alku;
        for (int j = -voittoja; j < voittoja; j++)
        {
            alku.push_back(0);
        }

        set<vector<int>> luvut = luoLista(alku, voittoja, a, 0);

        long long mahdollisia = 0LL;

        for (vector<int> v : luvut)
        {
            int voitotMaara = 1;
            int haviotMaara = 1;

            int voitotAlku = 0;
            int haviotAlku = 0;

            bool mahdollinen = true;
            int nytMahdollisa = 0;

            for (int j = 0; j < voittoja; j++)
            {

                if (v[voittoja + j] == 1)
                {
                    if (voitotAlku <= 0)
                    {
                        mahdollinen = false;
                        break;
                    }
                    voitotMaara *= voitotAlku;
                    voitotAlku--;
                }

                if (v[j] == 1)
                {
                    voitotAlku++;
                }
                else
                {
                    if (haviotAlku <= 0)
                    {
                        mahdollinen = false;
                        break;
                    }
                    haviotMaara *= haviotAlku;
                    haviotAlku--;
                }

                if (v[voittoja + j] != 1)
                {
                    haviotAlku++;
                }
            }
            if (mahdollinen)
            {
                /*for (int k : v)
                {
                    cout << k << " ";
                }
                cout << "\nMahdollisia: "
                     << (haviotMaara - b + 1) * (voitotMaara - a + 1) << "\n";*/
                mahdollisia += (haviotMaara) * (voitotMaara);
            }
        }

        cout << (mahdollisia * tasapeleja * kertomat[n]) % mod << "\n";
    }
}

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
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
(empty)

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
(empty)

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)