Cod sursa(job #466818)

Utilizator marius21Petcu Marius marius21 Data 27 iunie 2010 15:32:28
Problema Permutari2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <cstdio>
#include <cstring>

FILE *fin=fopen("permutari2.in","r");
FILE *fout=fopen("permutari2.out","w");

//#define BACK
//#define DEBUG

#define MODNR 10007

#ifndef BACK
int c[301][301];
long long fact[301];
#else

int st[301];
bool bif[301];
int count=0;

void back(int kk,int n,int k)
{
    if (kk==n+1)
    {
        int nr=0;
        for (int i=1; i<=n; i++)
        {
            bool ok=true;
            for (int j=1; j<=i; j++)
                if (st[j]>i)
                {
                    ok=false;
                    break;
                }
            if (ok)
                nr++;
        }
        if (nr==k)
        {
            count++;
            count%=MODNR;
        }
        return;
    }
	
    for (int i=1; i<=n; i++)
        if (!bif[i])
        {
            bif[i]=1;
            st[kk]=i;
            back(kk+1,n,k);
            bif[i]=0;
        }
}

#endif


int main()
{
	int n,k;
    fscanf(fin,"%d %d",&n,&k);
#ifndef BACK
    fact[0]=1;
    for (int i=1; i<=n; i++)
        fact[i]=(fact[i-1]*i)%MODNR;
	
	c[1][1]=1;
	for (int i=2; i<=n; i++)
	{
		int dif=0;
		for (int j=1; j<i; j++)
		{
			dif+=fact[i-j]*c[1][j];
			dif%=MODNR;
		}
		c[1][i]=(fact[i]-dif+MODNR)%MODNR;
	}
		 
	for (int i=2; i<=k; i++)
		for (int j=1; j<=n; j++)
        {
            c[i][j]=0;
            for (int k=1; k<j; k++)
            {
                c[i][j]+=c[i-1][k]*c[1][j-k];
				c[i][j]%=MODNR;
            }
        }
#ifdef DEBUG
	for (int i=1; i<=k; i++)
	{
		for (int j=1; j<=n; j++)
			fprintf(fout, "%.4d ",c[i][j]);
		fputc('\n', fout);
	}
#endif
    fprintf(fout,"%d\n",c[k][n]);
#else
#ifdef DEBUG
	int kk=k;
	int nn=n;
	for (int i=1;  i<=k; i++)
	{
		for (int j=1; j<=n; j++)
		{
			memset(bif,0,sizeof(bool)*j);
			back(1,j,i);
			fprintf(fout, "%.4d ",count);
			count=0;
		}
		fputc('\n',fout);
	}
#endif
    memset(bif,0,sizeof(bool)*n);
    back(1,n,k);
    fprintf(fout,"%d\n",count);
#endif
    fclose(fin);
    fclose(fout);
    return 0;
}