Pagini recente » Cod sursa (job #2502316) | Cod sursa (job #1074469) | Cod sursa (job #186098) | Cod sursa (job #966178) | Cod sursa (job #466818)
Cod sursa(job #466818)
#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;
}