Pagini recente » Cod sursa (job #2491109) | Cod sursa (job #3171897) | Cod sursa (job #420995) | Cod sursa (job #1543913) | Cod sursa (job #25521)
Cod sursa(job #25521)
# 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;
}