Cod sursa(job #1341821)

Utilizator EpictetStamatin Cristian Epictet Data 13 februarie 2015 09:36:44
Problema Sandokan Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <vector>
#include <cstring>
#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 <= num; i++)
    {
        if (fr[i])
        {
            sol = sol * Lg_Put(i, fr[i]) % MOD;
        }
    }
    fout << sol << '\n';
    fout.close();
    return 0;
}