Cod sursa(job #25615)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 4 martie 2007 13:08:55
Problema Kperm Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<stdio.h>

#define Q 666013
#define NMAX 5096

void read();
void solve();
int upg(int x, int y);
//void bkt(int x);

int N, K, P[NMAX], temp[16];

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

     read();
/*     bkt(0);
     printf("%d\n", rezz);*/
     solve();
	return 0;
}

void read()
{
	scanf("%d%d", &N, &K);
}

void solve()
{
	int i;
     long long rez;
     
	if(K % 2 == 0)
     {
     	printf("0\n");
          return;
     }

     P[0] = 1;
    	P[1] = 1;
     for(i = 2; i <= N; i++)
	P[i] = ((long long)P[i - 1] * i) % Q;

     rez = P[N % K];
     rez *= P[K - (N % K)];
     rez %= Q;
     rez *= upg(P[(N / K) + 1], N % K);
     rez %= Q;
     rez *= upg(P[N / K], K - (N % K));
     rez %= Q;
     printf("%d\n", rez);
}

int upg(int x, int y)
{
	long long i, rez = 1;
     int j;
     
     for(i = x, j = 0; (1 << j) <= y; i = (i * i) % Q, j++)
     temp[j] = i;
     for(;j >= 0; j--)
     if(y >= (1 << j))
     rez *= temp[j], rez %= Q, y -= 1 << j;
	return rez;
}

/*void bkt(int x)
{
	if(x == N)
     {
     	int sum = 0, i;
          
		for(i = 0; i < K; i++)
		sum += st[i], sum %= K;
          if(sum) return;
          for(i = K; i < N; i++)
          if((st[i] - st[i % K]) % K) return;
          rezz++, rezz %= Q;
          return;
     }
     for(int i = 1; i <= N; i++)
	if(!seen[i])
     {
     	seen[i] = 1, st[x] = i;
          bkt(x + 1);
          seen[i] = 0;
     }
}*/