Cod sursa(job #163536)
Utilizator | Data | 22 martie 2008 14:44:34 | |
---|---|---|---|
Problema | Sandokan | Scor | 50 |
Compilator | cpp | Status | done |
Runda | preONI 2008, Runda Finala, Clasele 5-8 | Marime | 2.2 kb |
#include <stdio.h>
int n,k,z,a[5000],c[5000],b[5000],rez,x,max;
int main()
{
freopen("sandokan.in","r",stdin);
freopen("sandokan.out","w",stdout);
scanf("%d%d",&n,&k);
int i,j;
z=(n-1)%(k-1);
if (z==0) rez=1;
if (rez==0)
{
//ciur
for (i=2; i<=n; ++i)
{
if (c[i]==1) continue;
a[++a[0]]=i;
j=i;
while (j+i<=n)
{
j+=i;
c[j]=1;
}
}
//_
//factori primi n!
for (i=2; i<=n-1; ++i)
{
x=i;
for (j=1; j<=a[0]; ++j)
{
while (x%a[j]==0 && x>1)
{
++b[j];
x/=a[j];
}
if (x==1) break;
}
}
//_
max=z;
if ((n-1)-z>max) max=(n-1)-z;
for (i=2; i<=max; ++i)
{
x=i;
for (j=1; j<=a[0]; ++j)
{
while (x%a[j]==0 && x>1)
{
if (i<=z) --b[j];
if (i<=(n-1)-z) --b[j];
x/=a[j];
}
if (x==1) break;
}
}
rez=1;
for (j=1; j<=a[0]; ++j)
{
while (b[j]>0)
{
rez=(rez*a[j])%2000003;
--b[j];
}
}
}
printf("%d\n",rez);
return 0;
}