Cod sursa(job #2973288)

Utilizator CristeaCristianCristea Cristian CristeaCristian Data 31 ianuarie 2023 18:14:28
Problema Numerele lui Stirling Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>

using namespace std;
using ll = long long;
ifstream cin("stirling.in");
ofstream cout("stirling.out");
const int MOD = 98999, NMAX = 205;
ll s1[NMAX][NMAX], s2[NMAX][NMAX], is_computed1[NMAX][NMAX], is_computed2[NMAX][NMAX];
ll stirling1(int n, int k)
{
    if(n < 1 || k < 1)
        return 0;
    if(n < k)
        return 0;
    if(n == k)
        return 1;
    if(is_computed1[n][k])
        return s1[n][k];
    s1[n][k] = (stirling1(n - 1, k - 1) - (n - 1) * stirling1(n - 1, k) % MOD) % MOD;
    is_computed1[n][k] = 1;
    return s1[n][k];
}
ll stirling2(int n, int k)
{
    if(n < 1 || k < 1)
        return 0;
    if(n < k)
        return 0;
    if(k == 1)
        return 1;
    if(n == k)
        return 1;
    if(is_computed2[n][k])
        return s2[n][k];
    s2[n][k] = (stirling2(n - 1, k - 1) + k * stirling2(n - 1, k) % MOD) % MOD;
    is_computed2[n][k] = 1;
    return s2[n][k];
}
void solve()
{
    int op, n, k;
    cin >> op >> n >> k;
    if(op == 1)
        cout << stirling1(n, k) << '\n';
    else
        cout << stirling2(n, k) << '\n';
}
int main()
{
    int T;
    cin >> T;
    while(T--)
        solve();
    return 0;
}