Cod sursa(job #2669387)

Utilizator MarcGrecMarc Grec MarcGrec Data 6 noiembrie 2020 20:53:00
Problema Numerele lui Stirling Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#define MOD 98999
#define MAX_SZ 200

#include <fstream>
using namespace std;

ifstream fin("stirling.in");
ofstream fout("stirling.out");

// I[i][j] = i paranteze, coeficientul lui x^j
int I[MAX_SZ + 1][MAX_SZ + 1];

// S[i][j] = i elemente, j submultimi nevide care formeaza o partitie
int S[MAX_SZ + 1][MAX_SZ + 1];

int main()
{
	I[1][0] = 0;
	
	I[1][1] = 1 % MOD;
	
	for (int i = 2; i < (MAX_SZ + 1); ++i)
	{
		I[i][0] = 0;
		
		for (int j = 1; j < i; ++j)
		{
			I[i][j] = (I[i - 1][j - 1] - I[i - 1][j] * (i - 1)) % MOD;
		}
		
		I[i][i] = 1 % MOD;
	} 
	
	S[1][1] = 1 % MOD;
	
	for (int i = 2; i < (MAX_SZ + 1); ++i)
	{
		S[i][1] = (S[i - 1][1] + 1) % MOD;
		
		for (int j = 2; j < i; ++j)
		{	
			S[i][j] = (S[i - 1][j] + S[i - j + 1][j - 1]) % MOD;
		}
		
		S[i][i] = (S[i - 1][i] + 1) % MOD;
	}
	
	int T;
	
	fin >> T;
	
	while ((--T) >= 0)
	{
		int x, n, m;
		
		fin >> x >> n >> m;
		
		if (x == 1)
		{
			fout << I[n][m] << '\n';
		}
		
		if (x == 2)
		{
			fout << ((MOD + S[n][m] - S[n - 1][m]) % MOD) << '\n';
		}
	}
	
	fin.close();
	fout.close();
	return 0;
}