Pagini recente » Cod sursa (job #1615312) | Cod sursa (job #2187770) | Cod sursa (job #2728140) | Cod sursa (job #2138990) | Cod sursa (job #27087)
Cod sursa(job #27087)
#include <stdio.h>
#define MOD 666013
#define MAXN 5005
int N, K;
long long fac[MAXN];
int main()
{
freopen("kperm.in", "rt", stdin);
freopen("kperm.out", "wt", stdout);
scanf("%d %d", &N, &K);
//daca fixez primele K resturi celelalte resturi din secventa vor fi determinate
//Secventa va fi r1r2r3...rK r1r2r3...rK r1r2r3...rK ...
//Toate resturile trebuie sa apara de N / K (+1) ori => toate resturile trebuie sa se afle in primele K resturi
//iar cele N % K care tb sa apara de N / K + 1 ori trebuie sa se afle la inceputul secventei de K resturi
if ((K * (K - 1) / 2) % K)
{
printf("0\n");
return 0;
}
int i;
for (fac[0] = 1, i = 1; i <= K || i <= N; i++)
fac[i] = (fac[i - 1] * i) % MOD;
long long REZ = (fac[N % K] * fac[K - (N % K)]) % MOD;
for (i = 0; i < K; i++)
{
if (i < N % K)
REZ *= fac[N / K + 1];
else
REZ *= fac[N / K];
REZ %= MOD;
}
printf("%lld\n", REZ);
return 0;
}