Cod sursa(job #1341056)

Utilizator EpictetStamatin Cristian Epictet Data 12 februarie 2015 12:39:25
Problema Sandokan Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
#include <vector>
#include <cstring>
#define MOD 2000003
using namespace std;
ifstream fin ("sandokan.in");
ofstream fout ("sandokan.out");
int N, K, sol, fr[5010];
vector < int > V;

void Ciur()
{
    V.push_back(0);
    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;
            }
        }
    }
}

int Lg_Put(int x, int p)
{
    int val = 1;
    while (p)
    {
        if (p & 1) val = val * x % MOD;
        x = x * x % MOD;
        p >>= 1;
    }
    return val;
}

int Comb(int n, int k)
{
    for (int i = k + 1; i <= n; i++)
    {
        int nr = i, j = 1;
        while (V[j] * V[j] <= nr)
        {
            while (nr && nr % V[j] == 0)
            {
                fr[V[j]]++;
                nr /= V[j];
            }
            j++;
        }
        if (nr) fr[nr]++;
    }
    for (int i = 2; i <= n - k + 1; i++)
    {
        int nr = i, j = 1;
        while (V[j] * V[j] <= nr)
        {
            while (nr && nr % V[j] == 0)
            {
                fr[V[j]]--;
                nr /= V[j];
            }
            j++;
        }
        if (nr) fr[nr]--;
    }

    int val = 1;
    for (int i = 2; i <= n; i++)
    {
        if (fr[i])
        {
            val = val * Lg_Put(i, fr[i]) % MOD;
        }
    }
    return val;
}

int main()
{
    fin >> N >> K;
    sol = 1;
    Ciur();
    while (N >= K)
    {
        memset(fr, 0, sizeof(fr));
        sol = sol * Comb(N, K) % MOD;
        N = N - K + 1;
    }

    fout << sol << '\n';
    fout.close();
    return 0;
}