Pagini recente » Cod sursa (job #2167021) | Cod sursa (job #1221236) | Cod sursa (job #1411129) | Cod sursa (job #2493613) | Cod sursa (job #2560330)
#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;
}