Cod sursa(job #3186198)

Utilizator AleXutzZuDavid Alex Robert AleXutzZu Data 21 decembrie 2023 22:59:28
Problema Numerele lui Stirling Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#include <cstring>

constexpr const int MOD = 98999;
constexpr const int MAX_N = 200;

int s[MAX_N + 1][MAX_N + 1] = {0};
int S[MAX_N + 1][MAX_N + 1] = {0};
bool ok_s[MAX_N + 1][MAX_N + 1] = {false};
bool ok_S[MAX_N + 1][MAX_N + 1] = {false};

int calc_s(int n, int k) {
    if (n == 0 && k == 0) return 1;
    if (n == 0 || k == 0) return 0;

    if (ok_s[n][k]) return s[n][k];
    ok_s[n][k] = true;
    return s[n][k] = (calc_s(n - 1, k - 1) - (n - 1) * calc_s(n - 1, k)) % MOD;
}

int calc_S(int n, int k) {
    if (n == k) return 1;
    if (n == 0 || k == 0) return 0;
    if (ok_S[n][k]) return S[n][k];

    ok_S[n][k] = true;
    return S[n][k] = (k * calc_S(n - 1, k) + calc_S(n - 1, k - 1)) % MOD;
}

int main() {
    std::ifstream input("stirling.in");
    std::ofstream output("stirling.out");

    memset(S, -1, sizeof S);
    memset(s, -1, sizeof s);

    int t;
    input >> t;
    while (t--) {
        int op, n, k;
        input >> op >> n >> k;
        output << (op == 1 ? calc_s(n, k) : calc_S(n, k)) << '\n';
    }
    return 0;
}