Cod sursa(job #25521)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 4 martie 2007 12:49:21
Problema Kperm Scor 20
Compilator cpp Status done
Runda preONI 2007, Runda 3, Clasele 11-12 Marime 1.13 kb
# include <stdio.h>

# define  _fin  "kperm.in"
# define  _fout "kperm.out"

# define  maxn  5002
# define  mod	666013

int n, k;
int viz[maxn];
int sol;


void readf()
{
	freopen(_fin, "r", stdin);
	scanf("%d%d", &n, &k);
}

inline int abs(int x)
{
	return x>0?x:-x;
}

int perm[maxn];

void back(int lev, int saux)
{
	if ( lev==n+1 )
	{
		++sol;
		return;
	}
	
	for (int i=1; i<=n; i++)
		if ( !viz[i] )
		{
			if ( lev<k )
				viz[i]=1, perm[lev]=i, back(lev+1, saux+i), viz[i]=0, perm[lev]=0;
			else if ( lev==k )
			{
				if ( !( (saux+i)%k ) )	// ok
					viz[i]=1, perm[lev]=i, back(lev+1, 0), viz[i]=0, perm[lev]=0;
			}
			else	// lev>k
				if ( abs( i-perm[ lev-k ] ) % k == 0 )
					viz[i]=1, perm[lev]=i, back(lev+1, 0), viz[i]=0, perm[lev]=0;
		}
}

void solve()
{
	if ( k&1 && n <= 20 ) back(1, 0);
	if ( n==k )
	{
		if ( (n*(n+1)/2) % k ) sol=0;
		else
		{
			int i;
			for (sol=1,i=2; i<=n; i++)
				 sol = (sol*i) % mod;
		}
	}
}

void writef()
{
	freopen(_fout, "w", stdout);
	printf("%d\n", sol);
}

int main()
{
	readf();
	solve();
	writef();
	
	return 0;
}