Pagini recente » Monitorul de evaluare | Cod sursa (job #3349356) | Diferente pentru problema/minmaxstore intre reviziile 3 si 4 | Cod sursa (job #3312191) | Cod sursa (job #3329503)
#include <iostream>
using namespace std;
#define MOD 2000003
#define MAXN 5000
int fact[MAXN + 1];
void precalculare(){
int i;
fact[0] = 1;
for (i = 1; i <= MAXN; i++){
fact[i] = 1LL * fact[i - 1] * i % MOD;
}
}
int exp(int nr){
int pow = MOD - 2, rez = 1;
while (pow > 0){
if (pow % 2 == 1){
rez = 1LL * rez * nr % MOD;
}
nr = 1LL * nr * nr % MOD;
pow /= 2;
}
return rez;
}
int comb(int N, int K){
int fctN = fact[N];
int fctK = exp(fact[K]);
int fctNK = exp(fact[N - K]);
return 1LL * fctN * fctK % MOD * fctNK % MOD;
}
int main()
{
FILE *fin, *fout;
fin = fopen("sandokan.in", "r");
fout = fopen("sandokan.out", "w");
precalculare();
int N, K, i, rest;
fscanf(fin, "%d%d", &N, &K);
///nu ne intereseaza sirul de numere pentru ca sunt distincte
///(adica oricum o sa avem un sir de forma a1 < a2 < a3 < ... < aN
N--;
K--;
for (i = 1; i * K <= N; i++){
}
i--;
K *= i;
fprintf(fout, "%d", comb(N, K));
fclose(fin);
fclose(fout);
return 0;
}