Cod sursa(job #2260260)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 14 octombrie 2018 18:20:09
Problema Sandokan Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
const int MOD = 2000003;

int FactFreq[6000], NrFactori;

int CombFact(int, int);
void InvMod(int, int, int&, int&);
int lgput(int a, int b);

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

    int N, K;

    scanf("%i %i", &N, &K);

    K = (N % (K - 1) == 0 ? K - 1 : N % (K - 1));
    printf("%i\n", CombFact(N - 1, K - 1));

    return 0;
}

int lgput(int a, int b) {
  int sol = 1, n = a;
  for(int i = 0; (1 << i) <= b; i++) {
    if(b & (1 << i))
      sol = 1LL * sol * n % MOD;
    n = 1LL * n * n % MOD;
  }
  return sol;
}

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

int CombFact(int N, int K)
{
    /// C(N, K) = N! * (N-K)!^(-1) * K!^(-1)
    int Result = 1, Fact = 1;
    for(int i = N - K + 1; i <= N; ++i)
        Result = 1LL * Result * i % MOD;
    for(int i = 2; i <= K; ++i)
        Fact = 1LL * Fact * i % MOD;

    int x, y;
    InvMod(Fact, MOD, x, y);

    return 1LL * Result * lgput(Fact, MOD - 2) % MOD;
}