Cod sursa(job #466108)

Utilizator indestructiblecont de teste indestructible Data 26 iunie 2010 10:24:02
Problema Permutari2 Scor 40
Compilator cpp Status done
Runda Stelele Informaticii 2010, gimnaziu si clasa a IX-a, Ziua 2 Marime 1.07 kb
#include <stdio.h>
#define NMAX 105
#define MOD 10007
int n,k,A[NMAX][NMAX][NMAX];
void precompute()
{
	A[1][1][1]=1;
	int i,j,t,p;
	for (i=2; i<=n; i++)
		A[1][i][0]=1;
	for (i=1; i<n; i++)
	{
		for (t=0; t<=i; t++)
		{
			A[i+1][i+1][t+1]+=A[i][i][t]; //j=i
			if (A[i+1][i+1][t+1]>=MOD)
				A[i+1][i+1][t+1]-=MOD;
			A[i+1][i+1][t+1]+=A[i][i+1][t];//j=i+1
			if (A[i+1][i+1][t+1]>=MOD)
				A[i+1][i+1][t+1]-=MOD;
			for (j=i+2; j<=n; j++)
			{
				A[i+1][j][t]+=A[i][j][t]*(j-i);
				if (A[i+1][j][t]>=MOD)
					A[i+1][j][t]%=MOD;
			}//pana aici maximul ramane ac
			//de aici se mareste
			for (p=i+2; p<=n; p++)
			{
				A[i+1][p][t]+=A[i][i][t];
				if (A[i+1][p][t]>=MOD)
					A[i+1][p][t]-=MOD;
			}
			for (j=i+1; j<=n; j++)
			{
				for (p=j+1; p<=n; p++)
				{
					A[i+1][p][t]+=A[i][j][t];
					if (A[i+1][p][t]>=MOD)
						A[i+1][p][t]-=MOD;
				}
			}
		}
	}
}
int main()
{
	freopen("permutari2.in","r",stdin);
	freopen("permutari2.out","w",stdout);
	scanf("%d%d",&n,&k);
	precompute();
	printf("%d\n",A[n][n][k]);
	return 0;
}