Cod sursa(job #2560330)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 27 februarie 2020 21:47:17
Problema Sandokan Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("sandokan.in");
ofstream fout("sandokan.out");

const int MOD = 2e6 + 3;

int n, k;

int lgpow(int base, int exp) {
  int ans;
  ans = 1;
  while (exp > 0) {
    if (exp % 2 > 0) {
      ans = (1LL * ans * base) % MOD;
    }
    base = (1LL * base * base) % MOD;
    exp >>= 1;
  }
  return ans;
}

int inv_mod(int n) {
  return lgpow(n, MOD - 2);
}

int fact(int n) {
  int ans;
  ans = 1;
  for (int i = 2; i <= n; ++i) {
    ans = (1LL * ans * i) % MOD;
  }
  return ans;
}

int nCk(int n, int k) {
  return 1LL * fact(n) * inv_mod(fact(n - k)) % MOD * inv_mod(fact(k)) % MOD;
}

int main() {
  int cnt;
  fin >> n >> k;
  // OK, am numere distincte, doar unul e maxim
  // Maximul ramane, trebuie sa vad cate numere voi mai avea.
  cnt = n;
  while (k <= cnt) {
    cnt -= (k - 1);
  }
  // La final am cnt elemente, dintre care unul e maximul, pe care il am fixat si nu il iau in calcul
  // Deci, pot alege din n - 1 (fara maxim) cnt - 1 elemente.
  fout << nCk(n - 1, cnt - 1);
  return 0;
}