Cod sursa(job #27082)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 6 martie 2007 08:07:40
Problema Kperm Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 0.9 kb
#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[1] = 1, i = 2; i <= K; 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;
}