Cod sursa(job #1344488)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 16 februarie 2015 19:22:36
Problema Sandokan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<fstream>
#include<cstring>
#include<vector>
#define MOD 2000003
using namespace std;
ifstream fin ("sandokan.in"); ofstream fout ("sandokan.out");
int n,k,num,fr[5010];
vector <int> v;
void Ciur()
{   for(int i=2;i<=n;i++)
       if(!fr[i])
        {   v.push_back(i);
            for(int j=i+i;j<=n;j+=i)  fr[j]=1;
        }
}
long long Lg_Put(long long x, int p)
{   long long val=1;
    while(p)
    {   if(p&1) val=val*x%MOD;
        x=x*x%MOD; p>>=1;
    }
    return val;
}
void Comb(int n, int k)
{   for(int i=k+1;i<=n;i++)
    {   int nr=i,j=0;
        while(v[j]*v[j]<=nr)
        {   while(nr%v[j]==0) {fr[v[j]]++; nr/=v[j];}
            j++;
        }
        if(nr>1) fr[nr]++;
    }
    for(int i=2;i<=n-k;i++)
    {   int nr=i,j=0;
        while(v[j]*v[j]<=nr)
        {   while(nr%v[j]==0) {fr[v[j]]--; nr/=v[j];}
            j++;
        }
        if(nr>1) fr[nr]--;
    }
}
int main()
{   fin>>n>>k;
    Ciur();
    memset(fr,0,sizeof(fr));
    num=n%(k-1);
    if(num==0) num=k-1;
    Comb(n-1,num-1);
    long long sol=1;
    for(int i=2;i<=n;i++)
        if(fr[i]) sol=sol*Lg_Put(i,fr[i])%MOD;
    fout<<sol<<'\n'; fout.close(); return 0;
}