Submission #203270

#TimeUsernameProblemLanguageResultExecution timeMemory
203270triAsceticism (JOI18_asceticism)C++14
100 / 100
16 ms1928 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pi;
typedef pair<ll, ll> pl;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;

#define pb push_back
#define f first
#define s second

const int MAXN = 1e5 + 10;
const ll MOD = 1e9 + 7;

ll fact[MAXN];
ll iFact[MAXN];

ll comb(int n, int k) {
    return fact[n] * iFact[k] % MOD * iFact[n - k] % MOD;
}

ll binExp(ll base, int exp) {
    base %= MOD;

    ll prod = 1;

    while (exp > 0) {
        if (exp & 1) {
            prod = prod * base % MOD;
        }
        base = base * base % MOD;
        exp >>= 1;
    }

    return prod;
}

int main() {
    fact[0] = 1;
    for (int i = 1; i < MAXN; i++) {
        fact[i] = fact[i - 1] * i % MOD;
    }
    iFact[MAXN - 1] = 549915853;

    assert(fact[MAXN - 1] * iFact[MAXN - 1] % MOD == 1);

    for (int i = MAXN - 2; i >= 0; i--) {
        iFact[i] = (i + 1) * iFact[i + 1] % MOD;
        assert(fact[i] * iFact[i] % MOD == 1);
    }

//    cout << comb(23134, 242) << endl;

//    cout << binExp(2342, 124515) << endl;

    int N, K;
    cin >> N >> K;
    K--;

    ll sum = 0;
    for (int i = 0; i <= K; i++) {
        ll val = comb(N + 1, i) * binExp(K + 1 - i, N) % MOD;
//        cout << val << endl;
        if (i % 2 == 0) {
            sum = (sum + val) % MOD;
        } else {
            sum = (sum - val + MOD) % MOD;
        }
    }

    cout << sum << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...