Cod sursa(job #1413622)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 1 aprilie 2015 23:25:10
Problema Sandokan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>

#define MOD 2000003

using namespace std;

long long n , k , ramas , i , x , inv , ins;
long long R;

void gcd(long long &x, long long &y, long long a, long long b)
{
     if (!b)
         x = 1, y = 0;
     else
     {
         gcd(x, y, b, a % b);
         long long aux = x;
         x = y;
         y = aux - y * (a / b);
     }
}


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

    /// combinari de (n - 1) luate cate (n % k - 1)

    scanf("%lld %lld", &n, &k);

    ramas = n % (k-1); ramas--; n--;

    /// combinari de (n) luate cate (ramas)
    /// n! / ramas! * (n - ramas)!

    R = 1; if (ramas < 0) ramas = 0;

    for (i = 1; i <= n; ++i)
        R = R * i % MOD;

    for (i = 1; i <= ramas; ++i)
    {
        inv = 0;
        gcd(inv , ins , i , MOD);
        if (inv <= 0) inv = MOD + inv % MOD;
        R = R * inv % MOD;
    }

    for (i = 1; i <= n - ramas; ++i)
    {
        inv = 0;
        gcd(inv , ins , i , MOD);
        if (inv <= 0) inv = MOD + inv % MOD;
        R = R * inv % MOD;
    }

    printf("%lld\n", R % MOD);

    return 0;
}