Cod sursa(job #3306771)

Utilizator Lex._.Lex Guiman Lex._. Data 13 august 2025 15:59:26
Problema Sandokan Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>
#define MOD 2000003
using namespace std;

void euclid(int a, int b, int& x1, int& y1) ///invers modular
{
    if(b==0)
    {
        x1=1;
        y1=1;
    }
    else
    {
        int x2, y2;
        euclid(b, a%b, x2, y2);
        x1=y2;
        y1=x2-a/b*y2;
    }
}

int C(int a, int b) ///combinari de a luate cate b
{
    if(a<b) return 0;
    int C=1, fact=1; ///fact = b!

    for(int i=1; i<=b; i++)
    {
        C=(long long)C*(a-i+1) %MOD;
        fact=(long long)fact*i %MOD;
    }
    int invers_mod, y; ///invers_mod = inversul modular al lui b!
    euclid(fact, MOD, invers_mod, y);
    while(invers_mod<0) invers_mod+=MOD;

    C=(long long)C*invers_mod %MOD;
    return C;
}

int main()
{
    ifstream in("sandokan.in");
    ofstream out("sandokan.out");
    int n, k;
    in >> n >> k;

    ///la final vor fi n%(k-1) elemente ramase (se elimina k-1 elemente de fiecare data)
    ///fiindca cel mai mare element din sir nu poate fi eliminat, acela va aparea sigur in sirul final
    ///astfel, numarul de moduri de a alege cele n%(k-1) elemente finale va fi combinari de n-1 luate cate n%(k-1)-1

    out << C(n-1, n%(k-1)-1);

    return 0;
}