Pagini recente » Cod sursa (job #838822) | Cod sursa (job #721509) | Cod sursa (job #655717) | Cod sursa (job #1701121) | Cod sursa (job #3189689)
#include <bits/stdc++.h>
using namespace std;
const int mod = 2000003, nmax = 5000;
int fact[5 + nmax], invfact[5 + nmax];
int lgpow(int base, int exponent) {
int result = 1;
while (exponent) {
if (exponent % 2) {
result = 1ll * result * base % mod;
}
base = 1ll * base * base % mod;
exponent /= 2;
}
return result;
}
void precalc() {
fact[0] = 1;
for (int i = 1; i <= nmax; ++i) {
fact[i] = 1ll * fact[i - 1] * i % mod;
}
invfact[nmax] = lgpow(fact[nmax], mod - 2);
for (int i = nmax - 1; i >= 0; --i) {
invfact[i] = 1ll * invfact[i + 1] * (i + 1) % mod;
}
}
int comb(int n, int k) {
if (n < 0 || k < 0 || n < k) {
return 0;
}
return 1ll * fact[n] * invfact[k] % mod * invfact[n - k] % mod;
}
int main() {
precalc();
ifstream fin("sandokan.in");
ofstream fout("sandokan.out");
int n, k;
fin >> n >> k;
// daca iau maxim, pot sa il iau pe el cu inca oricare k - 1 elemente
// deci comb(n - 1, cate raman - 1)
fout << comb(n - 1, (n % (k - 1) == 0 ? k - 1 : n % (k - 1)) - 1) << '\n';
return 0;
}