Cod sursa(job #25090)

Utilizator stef2nStefan Istrate stef2n Data 4 martie 2007 10:32:53
Problema Kperm Scor 100
Compilator cpp Status done
Runda preONI 2007, Runda 3, Clasele 11-12 Marime 1.32 kb
#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;
}