Pagini recente » Cod sursa (job #3159559) | Cod sursa (job #865711) | Cod sursa (job #2936218) | Cod sursa (job #1651081) | Cod sursa (job #25202)
Cod sursa(job #25202)
#include <cstdio>
#define maxn 1024
#include <algorithm>
using namespace std;
int N, K, viz[maxn], x[maxn];
int nr;
int a[1000000];
void citire()
{
freopen("kperm.in", "r", stdin);
scanf("%d %d\n", &N, &K);
}
void back(int k)
{
if(k==N+1) nr++, nr%=666013;
else
{
if(k<=K)
{
for(int i=1;i<=N;i++)
if(!viz[i])
{
viz[i]=1;
x[k]=i;
back(k+1);
viz[i]=0;
}
}
else
{
for(int i=1; i*K+x[k-K]<=N; i++)
{
if(!viz[i*K+x[k-K]])
{
viz[i*K+x[k-K]]=1;
x[k]=i*K+x[k-K];
back(k+1);
viz[i*K+x[k-K]]=0;
}
}
for(int i=1;x[k-K]-i*K>0 ; i++)
//if(x[k-K]-i*K>=1)
if(!viz[x[k-K]-i*K])
{
viz[x[k-K]-i*K]=1;
x[k]=x[k-K]-i*K;
back(k+1);
viz[x[k-K]-i*K]=0;
}
}
}
}
void back2()
{
int i;
for(i=1;i<=N;i++) x[i]=i;
do
{
int sum=0, ok=1;
for(i=1;i<K;i++) sum+=x[i];
for(int j=K;j<=N;j++)
{
sum+=x[j];
//printf("%d %d\n", sum, K);
if(sum%K!=0) {ok=0;break;}
sum-=x[j-K+1];
}
if(ok) nr++;
}while(next_permutation(x+1, x+N+1));
}
void mul(int A[], int B)
{
int i, t=0;
for(i=1;i<=A[0] || t; i++, t/=10)
A[i]=(t+=A[i]*B)%10;
A[0]=i-1;
}
int mod(int A[], int B)
{
int i, t=0;
for(i=A[0];i>0;i--)
t=(t*10+A[i])%B;
return t;
}
int main()
{
citire();
freopen("kperm.out", "w", stdout);
if(K%2==0){ printf("0\n"); return 0;}
if(K==1 || K==N)
{
a[0]=1;
a[1]=1;
for(int i=2;i<=N;i++) mul(a, i);
printf("%d\n", mod(a, 666013));
return 0;
}
back(1);
printf("%d\n", nr%666013);
return 0;
}