Cod sursa(job #3289567)

Utilizator Mircea08Tomita Mircea Stefan Mircea08 Data 27 martie 2025 14:43:14
Problema Numerele lui Stirling Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.73 kb
#include <cstdint>
#include <iostream>
const int64_t NMAX = 2e2, MOD = 98999;

int64_t fastExp(int64_t a, int64_t b, const int64_t &MOD) {
    int64_t ans = 1;
    while (b > 0) {
        if ((b & 1) == 1) {
            ans = (ans * a) % MOD;
        }
        a = (a * a) % MOD;
        b >>= 1;
    }
    return ans;
}
void precomputeComb(int64_t fact[], int64_t invFact[], const int64_t &n, const int64_t &MOD) {
    int64_t i;
    fact[0] = 1;
    for (i = 1; i <= n; ++ i) {
        fact[i] = (fact[i - 1] * i) % MOD;
    }
    invFact[n] = fastExp(fact[n], MOD - 2, MOD);
    for (i = n - 1; i >= 0; -- i) {
        invFact[i] = (invFact[i + 1] * (i + 1)) % MOD;
    }
}
void precomputeStirlingFirstKind(int64_t stirling[NMAX + 1][NMAX + 1], const int64_t &n, const int64_t &MOD) {
    int64_t i, j;
    stirling[0][0] = 1;
    for (i = 1; i <= n; ++ i) {
        for (j = 1; j <= i; ++ j) {
            stirling[i][j] = (((i - 1) * stirling[i - 1][j]) % MOD + stirling[i - 1][j - 1]) % MOD;
        }
    }
}
void precomputeStirlingSecondKind(int64_t stirling[NMAX + 1][NMAX + 1], const int64_t &n, const int64_t &MOD) {
    int64_t i, j;
    stirling[0][0] = 1;
    for (i = 1; i <= n; ++ i) {
        for (j = 1; j <= i; ++ j) {
            stirling[i][j] = ((j * stirling[i - 1][j]) % MOD + stirling[i - 1][j - 1]) % MOD;
        }
    }
}

int64_t fact[NMAX + 1], invFact[NMAX + 1], stirlingFirst[NMAX + 1][NMAX + 1], stirlingSecond[NMAX + 1][NMAX + 1];

int64_t arang(const int64_t &n, const int64_t &k) {
    if (k > n) {
        return 0;
    }
    return (fact[n] * invFact[k]) % MOD;
}
int64_t comb(const int64_t &n, const int64_t &k) {
    if (k > n) {
        return 0;
    }
    return ((fact[n] * invFact[n - k]) % MOD * invFact[k]) % MOD;
}
int64_t stirlingFirstKind(const int64_t &n, const int64_t &k) {
    if (k > n) {
        return 0;
    }
    return stirlingFirst[n][k];
}
int64_t stirlingSecondKind(const int64_t &n, const int64_t &k) {
    if (k > n) {
        return 0;
    }
    return stirlingSecond[n][k];
}

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    freopen("stirling.in", "r", stdin);
    freopen("stirling.out", "w", stdout);

    precomputeComb(fact, invFact, NMAX, MOD);
    precomputeStirlingFirstKind(stirlingFirst, NMAX, MOD);
    precomputeStirlingSecondKind(stirlingSecond, NMAX, MOD);

    int64_t tests, task, n, k;
    std::cin >> tests;
    for (; tests > 0; -- tests) {
        std::cin >> task >> n >> k;
        if (task == 1) {
            std::cout << stirlingFirstKind(n, k) << '\n';
        }
        else {
            std::cout << stirlingSecondKind(n, k) << '\n';
        }
    }
    return 0;
}