CSES - Datatähti 2025 alku - Results
Submission details
Task:Kortit II
Sender:anotn
Submission time:2024-11-07 13:41:30 +0200
Language:C++ (C++17)
Status:READY
Result:8
Feedback
groupverdictscore
#1ACCEPTED3
#2ACCEPTED5
#30
#40
#50
Test results
testverdicttimegroup
#1ACCEPTED0.00 s1, 2, 3, 4, 5details
#2ACCEPTED0.09 s2, 3, 4, 5details
#3--3, 4, 5details
#4--4, 5details
#5--5details
#6--5details

Compiler report

input/code.cpp: In function 'int dfs(std::vector<int>&, std::set<int>&, std::pair<int, int>&)':
input/code.cpp:27:23: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   27 |     if ( (nums.size() == n) && (score == pair<int, int>(0, 0)) )
      |           ~~~~~~~~~~~~^~~~
input/code.cpp:42:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |         if ( i < nums.size() )
      |              ~~^~~~~~~~~~~~~
input/code.cpp:44:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |         else if ( i > nums.size() )
      |                   ~~^~~~~~~~~~~~~

Code

#include <iostream>
#include <vector>
#include <set>
#include <map>
using namespace std;
 
 
/*
Nykynen suunnitelma:
1. Peli voi kulkea n! eri tavalla, sillä samat kortit pelattuna pareittain eri järjestyksessä johtaa samaan tulokseen
2. Tämän jälkeen katsotaan jokaiselle numerolle, mikä on pienin ja suurin luku millä sen voi korvata
3. Toistetaan askel 2 memoisaatiolla, kunnes ollaan valmiita
*/
 
int n;
int mod = 1e9+7;

struct mem_type {
    size_t length;
    set<int> not_used;
    pair<int, int> score;
};

map<pair<size_t, pair<set<int>, pair<int, int>>>, int> mem;
 
int dfs ( vector<int>& nums, set<int>& not_used, pair<int, int>& score ) {
    if ( (nums.size() == n) && (score == pair<int, int>(0, 0)) )
        return 1;
    else if ( score.first < 0 || score.second < 0 )
        return 0;
    else if ( mem.find({nums.size(), {not_used, score}}) != mem.end() )
        return mem[{nums.size(), {not_used, score}}];

    int ans = 0;
    auto new_not_used = not_used;
    for ( auto i : not_used) {

        nums.push_back(i);
        auto new_score = score;
        new_not_used.erase(i);

        if ( i < nums.size() )
            new_score.second--;
        else if ( i > nums.size() )
            new_score.first--;

        ans += dfs(nums, new_not_used, new_score);
        ans %= mod;

        nums.pop_back();
        new_not_used.insert(i);
    }

    mem[{nums.size(), {not_used, score}}] = ans;
    return ans;
}
 
 
int main () {
    int t;
    cin >> t;
 
    int64_t ans[t];
    
    for ( int i = 0; i < t; i++ ) {
        
        int a, b;
 
        cin >> n >> a >> b;
 
        if ( (a+b) > n || (a == 0 && b != 0) || (a != 0 && b == 0)) {
            ans[i] = 0;
            continue;
        }

        vector<int> nums;
        set<int> not_used;
        
        pair<int, int> score = {a, b};

        for ( int i = 1; i <= n; i++ )
            not_used.insert(i);

        ans[i] = int64_t(dfs(nums, not_used, score));
        
        int64_t mod_long = mod;
        for (int64_t j = 2; j <= n; j++) {
            ans[i] *= j;
            ans[i] %= mod_long;
        }
    }
 
    for (auto n : ans)
        cout << n << "\n";
}

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:

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)