Cod sursa(job #1498488)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 8 octombrie 2015 17:39:51
Problema Numerele lui Stirling Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 200;
const int MOD = 98999;

int s1[Nmax + 1][Nmax + 1];
int s2[Nmax + 1][Nmax + 1];

int s(int n, int m)
{
    if ( !n || !m || ( n < m ) )
        return 0;
    if ( n == 1 && m == 1 )
        return 1;
    if ( s1[n][m] )
        return s1[n][m];
    return s1[n][m] = (s(n - 1, m - 1) - (n - 1) * s(n - 1, m)) % MOD;
}

int S(int n, int m)
{
    if ( !n || !m || ( n < m ) )
        return 0;
    if ( n == 1 && m == 1 )
        return 1;
    if ( s2[n][m] )
        return s2[n][m];
    return s2[n][m] = (S(n - 1, m - 1) + m * S(n - 1, m)) % MOD;
}

int main()
{
    ifstream in("stirling.in");
    ofstream out("stirling.out");
    in.tie(0);
    ios_base::sync_with_stdio(0);
    int T, kind, n, m;

    in >> T;
    while ( T-- )
    {
        in >> kind >> n >> m;
        if ( kind == 1 )
            out << s(n, m) << '\n';
        else
            out << S(n, m) << '\n';
    }
    in.close();
    out.close();
    return 0;
}