Cod sursa(job #1341061)

Utilizator EpictetStamatin Cristian Epictet Data 12 februarie 2015 12:56:20
Problema Sandokan Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <fstream>
#include <vector>
#include <cstring>
#define MOD 2000003
using namespace std;
ifstream fin ("sandokan.in");
ofstream fout ("sandokan.out");
long long N, K, num, sol, 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;
    num = N;
    Ciur();
    memset(fr, 0, sizeof(fr));
    while (N >= K)
    {
        Comb(N, K);
        N = N - K + 1;
    }

    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;
}