CSES - Datatähti 2025 alku - Results
Submission details
Task:Kortit II
Sender:vgtcross
Submission time:2024-10-28 03:23:26 +0200
Language:C++ (C++20)
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED3
#2ACCEPTED5
#3ACCEPTED26
#4ACCEPTED28
#5ACCEPTED38
Test results
testverdicttimegroup
#1ACCEPTED0.06 s1, 2, 3, 4, 5details
#2ACCEPTED0.06 s2, 3, 4, 5details
#3ACCEPTED0.07 s3, 4, 5details
#4ACCEPTED0.07 s4, 5details
#5ACCEPTED0.06 s5details
#6ACCEPTED0.07 s5details

Code

#include <bits/stdc++.h>

#define MODE 1

#if MODE
#define debug(x) cout << #x << ": " << (x) << endl
#define log(x) cout << (x) << endl
#define test(x) x
#else
#define debug(x)
#define log(x)
#define test(x)
#endif

#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define fi first
#define se second
#define X real()
#define Y imag()

using namespace std;
using ll = long long;
using ld = long double;
using uint = unsigned int;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using P = complex<ll>;

template<typename S, typename T = S> void chmin(S &s, T t) {s = s < t ? s : t;}
template<typename S, typename T = S> void chmax(S &s, T t) {s = s > t ? s : t;}

const ll M = 1000000007; // 998244353

struct mint {
    int v;
    mint() {}
    mint(long long v) : v(0 <= v && v < M ? v : (v % M + M) % M) {}
    
    mint operator+(mint oth) {
        return v + oth.v < M ? v + oth.v : v + oth.v - M;
    }
    
    mint operator-(mint oth) {
        return v - oth.v >= 0 ? v - oth.v : v - oth.v + M;
    }
    
    mint operator*(mint oth) {
        return (long long) v * oth.v % M; 
    }
    
    mint pow(ll e) {
        if (e == 0) return mint(1);
        mint a = this->pow(e/2);
        a *= a;
        if (e & 1) return a * (*this);
        return a;
    }
    
    mint inv() {
        return this->pow(M-2);
    }
    
    mint operator/(mint oth) {
        return (*this) * oth.inv();
    }
    
    mint operator+=(mint oth) {
        (*this) = (*this) + oth;
        return *this;
    }
    
    mint operator-=(mint oth) {
        (*this) = (*this) - oth;
        return *this;
    }
    
    mint operator*=(mint oth) {
        (*this) = (*this) * oth;
        return *this;
    }
    
    mint operator/=(mint oth) {
        (*this) = (*this) / oth;
        return *this;
    }
    
    mint operator++() {
        return *this += 1;
    }
    
    mint operator++(int) {
        return (*this += 1) - 1;
    }
    
    mint operator--() {
        return *this -= 1;
    }
    
    mint operator--(int) {
        return (*this -= 1) + 1;
    }
    
    mint operator+(int oth) {
        return *this + mint(oth);
    }
    
    mint operator-(int oth) {
        return *this - mint(oth);
    }
    
    mint operator*(int oth) {
        return *this * mint(oth);
    }
    
    mint operator/(int oth) {
        return *this / mint(oth);
    }
    
    mint operator+=(int oth) {
        return *this += mint(oth);
    }
    
    mint operator-=(int oth) {
        return *this -= mint(oth);
    }
    
    mint operator*=(int oth) {
        return *this *= mint(oth);
    }
    
    mint operator/=(int oth) {
        return *this /= mint(oth);
    }
};

mint inv(mint i) { return i.inv(); }
mint pow(mint b, ll e) { return b.pow(e); }

mint operator+(int a, mint oth) {
    return mint(a) + oth;
}

mint operator-(int a, mint oth) {
    return mint(a) - oth;
}

mint operator*(int a, mint oth) {
    return mint(a) * oth;
}

mint operator/(int a, mint oth) {
    return mint(a) / oth;
}

std::ostream &operator<<(std::ostream &os, mint i) {
    os << i.v;
    return os;
}

std::istream &operator>>(std::istream &is, mint &i) {
    is >> i.v;
    return is;
}

struct factorial {
    int n;
    vector<mint> f, i;
    
    factorial() {}
    factorial(int n) : n(n) {
        f.resize(n+1);
        i.resize(n+1);
        f[0] = 1;
        for (int j = 1; j <= n; ++j) f[j] = j * f[j-1];
        i[n] = 1 / f[n];
        for (int j = n-1; j >= 0; --j) i[j] = (j+1) * i[j+1];
    }
    
    mint ncr(int n, int k) {
        if (0 > k || k > n) return 0;
        return f[n] * i[k] * i[n-k];
    }
    
    mint npr(int n, int k) {
        if (0 > k || k > n) return 0;
        return f[n] * i[n-k];
    }
};

const int N = 2020;
factorial F(N);

mint dp[N][N];

void init() {
    dp[0][0] = 1;
    for (int i = 1; i < N; ++i) {
        for (int j = 1; j < N; ++j) {
            dp[i][j] = i * dp[i][j-1] + j * dp[i-1][j] + (i + j - 1) * dp[i-1][j-1];
        }
    }
}

void solve() {
    int n, a, b;
    cin >> n >> a >> b;
    
    cout << dp[a][b] * F.ncr(n, a+b) * F.f[n] << '\n';
}

int main() {
    cin.tie(0) -> sync_with_stdio(0);
    
    init();
    
    int t = 0;
    if (t == 0) cin >> t;
    while (t--) solve();
    
    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: ACCEPTED

input
841
19 3 12
19 19 13
19 7 13
20 11 15
...

correct output
40291066
0
0
0
0
...

user output
40291066
0
0
0
0
...

Test 4

Group: 4, 5

Verdict: ACCEPTED

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
494558320
0
340694548
...

Test 5

Group: 5

Verdict: ACCEPTED

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

Test 6

Group: 5

Verdict: ACCEPTED

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

correct output
750840601
678722180
744501884
159164549
868115056
...

user output
750840601
678722180
744501884
159164549
868115056
...