Cod sursa(job #3189689)

Utilizator Traian_7109Traian Mihai Danciu Traian_7109 Data 6 ianuarie 2024 13:46:58
Problema Sandokan Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#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;
}