Submission #1365338

#TimeUsernameProblemLanguageResultExecution timeMemory
1365338SkymagicAsceticism (JOI18_asceticism)C++17
100 / 100
1 ms344 KiB
#include <iostream>
#include <vector>

using namespace std;

long long MOD = 1e9 + 7;

// Function to calculate (base^exp) % MOD
long long power(long long base, long long exp) {
    long long res = 1;
    base %= MOD;
    while (exp > 0) {
        if (exp % 2 == 1) res = (res * base) % MOD;
        base = (base * base) % MOD;
        exp /= 2;
    }
    return res;
}

// Function to calculate modular inverse using Fermat's Little Theorem
long long modInverse(long long n) {
    return power(n, MOD - 2);
}

// Precompute factorials for fast nCr calculation
vector<long long> fact;
void precomputeFactorials(int n) {
    fact.resize(n + 1);
    fact[0] = 1;
    for (int i = 1; i <= n; i++) fact[i] = (fact[i - 1] * i) % MOD;
}

long long nCr(int n, int r) {
    if (r < 0 || r > n) return 0;
    return (((fact[n] * modInverse(fact[r])) % MOD) * modInverse(fact[n - r])) % MOD;
}

long long eulerianFormula(int n, int k) {
    long long sum = 0;
    precomputeFactorials(n + 1);

    for (int j = 0; j <= k + 1; j++) {
        long long term = (nCr(n + 1, j) * power(k + 1 - j, n)) % MOD;
        
        if (j % 2 == 1) {
            sum = (sum - term + MOD) % MOD;
        } else {
            sum = (sum + term) % MOD;
        }
    }
    return sum;
}

int main() { // hi
    int n, k;
    cin >> n >> k;
    k--;

    if (k < 0 || k >= n) cout << 0 << '\n';
    else cout <<eulerianFormula(n, k) << '\n';

    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...