Cod sursa(job #25202)

Utilizator blasterzMircea Dima blasterz Data 4 martie 2007 11:21:45
Problema Kperm Scor 20
Compilator cpp Status done
Runda preONI 2007, Runda 3, Clasele 11-12 Marime 1.63 kb
#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;
}