Pagini recente » Cod sursa (job #1704075) | Cod sursa (job #3191789) | Cod sursa (job #2687620) | Borderou de evaluare (job #338045) | Cod sursa (job #25838)
Cod sursa(job #25838)
#include <stdio.h>
#include <stdlib.h>
#define infile "kperm.in"
#define outfile "kperm.out"
#define NMAX 5005
#define MOD 666013
FILE *fin,*fout;
int n,k;
long long fact[NMAX];
int count[NMAX],max,min,countmin,countmax;
void init()
{
int i;
fact[0]=1;
for(i=1;i<=n;i++)
{
fact[i]=fact[i-1]*(long long)i;
fact[i]%=MOD;
}
for(i=0;i<k;i++)
count[i]=0;
for(i=1;i<=n;i++)
count[i%k]++;
max=-1; min=n+1;
for(i=0;i<k;i++)
{
if(max<count[i])
max=count[i];
if(min>count[i])
min=count[i];
}
countmin=countmax=0;
for(i=0;i<k;i++)
{
if(count[i]==min)
countmin++;
if(count[i]==max)
countmax++;
}
}
void solution(long long rez)
{
fout=fopen(outfile,"w");
fprintf(fout,"%Ld\n",rez);
fclose(fout);
exit(0);
}
int main()
{
long long rez;
int i;
fin=fopen(infile,"r");
fscanf(fin,"%d %d",&n,&k);
fclose(fin);
init();
if((k*(k-1)/2)%k)
solution(0);
if(min==max)
{
rez=1;
for(i=0;i<k;i++)
rez=(rez*fact[min])%MOD;
rez=(rez*fact[k])%MOD;
solution(rez);
}
// min!=max
rez=1;
for(i=0;i<countmax;i++)
rez=(rez*fact[max])%MOD;
rez=(rez*fact[countmax])%MOD;
for(i=0;i<countmin;i++)
rez=(rez*fact[min])%MOD;
rez=(rez*fact[countmin])%MOD;
solution(rez);
return 0;
}