Cod sursa(job #1415002)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 3 aprilie 2015 15:23:55
Problema Sandokan Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>

#define MOD 2000003

using namespace std;

bool pm[5010];
int prim[5010], exp[5010], k;

inline void ciur (int n)
{
    for (int i = 2; i <= n; ++i)
        if (!pm[i])
        {
            prim[++k] = i;
            for (int j = i * i; j <= n; j += i)
                pm[j] = true;
        }
}

int main ()
{
    freopen ("sandokan.in", "r", stdin);
    freopen ("sandokan.out", "w", stdout);

    int n, p;
    scanf ("%d %d", &n, &p);

    --n;
    --p;

    ciur (n);
    for (int i = 1; i <= k; ++i)
    {
        for (int h = prim[i]; h <= n; h *= prim[i])
            exp[i] += n / h;
    }

    for (int i = 1; prim[i] <= p && i <= k; ++i)
    {
        for (int h = prim[i]; h <= p; h *= prim[i])
            exp[i] -= p / h;
    }

    for (int i = 1; prim[i] <= n - p && i <= k; ++i)
    {
        for (int h = prim[i]; h <= n - p; h *= prim[i])
            exp[i] -= (n - p) / h;
    }

    long long rez = 1LL;
    for (int i = 1; i <= k; ++i)
        for (int j = 1; j <= exp[i]; ++j)
            {
                rez *= 1LL * prim[i];
                rez %= MOD;
            }

    printf ("%lld\n", rez);

    return 0;
}