Cod sursa(job #3225598)

Utilizator andreiqwerBesu-Roca Andrei andreiqwer Data 18 aprilie 2024 08:39:55
Problema Numerele lui Stirling Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 kb
#include <fstream>

using namespace std;

ifstream cin("stirling.in");
ofstream cout("stirling.out");

//s(n, k) = s(n-1, k-1) - (n-1) * s(n-1, k)
//S(n, k) = S(n-1, k-1) + k * S(n-1, k)

#define nmax 200
#define kmax 200

int dp[nmax+1][kmax+1], dp2[nmax+1][kmax+1];
int mod=98999;

int stirling1(int n, int k)
{
	if(dp[n][k]!=0)
		return dp[n][k];

	dp[0][0]=1;

	for(int i=1; i<=n; i++)
		for(int j=1; j<=min(i, k); j++)
			dp[i][j]=(dp[i-1][j-1]-(i-1)*dp[i-1][j])%mod;		

	return dp[n][k];
}

int stirling2(int n, int k)
{
	if(dp2[n][k]!=0)
		return dp2[n][k];

	dp2[0][0]=1;

	for(int i=1; i<=n; i++)
		for(int j=1; j<=min(i, k); j++)
			dp2[i][j] = (dp2[i-1][j-1]%mod+(j*dp2[i-1][j])%mod)%mod;

	return dp2[n][k];
}

int t, q, n, m;
int main()
{
	cin>>t;
	stirling1(200, 200);
	stirling2(200, 200);
	for(int i=1; i<=t; i++)
	{
		cin>>q>>n>>m;
		if(q==1)
			cout<<dp[n][m]<<'\n';
		else
			cout<<dp2[n][m]<<'\n';
	}
}