Cod sursa(job #26125)

Utilizator gcosminGheorghe Cosmin gcosmin Data 5 martie 2007 11:16:24
Problema Kperm Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#include <algorithm>
using namespace std;

#define NMAX 5010
#define MOD 666013
#define LL long long

int N, K;

int a[NMAX];
int nap[NMAX];
int mod[NMAX];

int main()
{
	int i, s;
	
	freopen("kperm.in", "r", stdin);
	freopen("kperm.out", "w", stdout);

	scanf("%d %d", &N, &K);

/*	
	int e;
	N = 3; K = 5;

	for (i = 1; i <= N; i++) a[i] = i;

	int nr = 0;
	while (1) {
		s = 0; e = 1;
		for (i = 1; i <= N; i++) {
			s += a[i];
			if (i > K) s -= a[i - K];

			if (i >= K && s % K != 0) e = 0;
		}

		if (e) {
//			for (i = 1; i <= N; i++) printf("%d ", a[i] % K);
//			printf("\n");
		}

		nr += e;

		if (!next_permutation(a + 1, a + N + 1)) break;
	}

	printf("%d\n", nr);
*/
	s = 0;

	for (i = 1; i < K; i++) s = (s + i) % K;
	
	if (s) {
		printf("0\n");
		return 0;
	}

	for (i = 1; i <= N; i++) nap[i % K]++;

	mod[1] = 1;
	for (i = 2; i <= N; i++) mod[i] = ((LL)mod[i-1] * i) % MOD;

	int md = N % K;

	int rez;

	if (!md) rez = mod[K];
	else rez = ((LL) mod[md] * mod[K - md]) % MOD;

	for (i = 0; i < K; i++) rez = ((LL)rez * mod[nap[i]]) % MOD;

	printf("%d\n", rez);
	
fclose(stdout);
return 0;
}