Cod sursa(job #163537)

Utilizator raduzerRadu Zernoveanu raduzer Data 22 martie 2008 14:44:34
Problema Sandokan Scor 50
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 9-a 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;
}