Cod sursa(job #3241525)

Utilizator Mateixx1Trandafir matei Mateixx1 Data 31 august 2024 10:09:25
Problema Invers modular Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
using namespace std;
ifstream f("gard2.in");
ofstream g("gard2.out");
const int NMAX=51,MAXC=91;
int N,K,D[NMAX][MAXC],aux[MAXC];
long long C[NMAX][NMAX];

void add(int A[],int B[]) {
    int T=0;
    if(A[0]<B[0]) {
        A[0]=B[0];
    }
    for(int i=1; i<=A[0]; i++) {
        T+=A[i]+B[i];
        A[i]=T%10;
        T/=10;
    }
    if(T>0) {
        A[++A[0]]=1;
    }
}

void genComb() {
    C[0][0]=1;
    for(int i=1; i<=N; i++) {
        C[i][0]=C[i][i]=1;
        for(int j=1; j<i; j++) {
            C[i][j]=C[i-1][j]+C[i-1][j-1];
        }
    }
}
void afis(int A[]) {
    for(int i=A[0]; i>=1; i--) {
        g<<A[i];
    }
}
void init(int A[]) {
    for(int i=1; i<=A[0]; i++) {
        A[i]=0;
    }
    A[0]=1;
}

void mul(int A[],long long B,int C[]) {
    long long T=0;
    C[0]=A[0];
    for(int i=1; i<=C[0]; i++) {
        T+=A[i]*B;
        C[i]=T%10;
        T/=10;
    }
    while(T>0) {
        C[++C[0]]=T%10;
        T/=10;
    }
}

void calcul() {
    D[0][0]=D[0][1]=1;
    D[1][0]=D[1][1]=1;
    for(int i=2; i<=N; i++) {
        D[i][0]=1;
        for(int x=1; x<=min(K,i); x++) {
            init(aux);
            mul(D[i-x],C[i][x],aux);
            add(D[i],aux);
        }
    }
}

int main() {
    f>>N>>K;
    genComb();
    calcul();
    afis(D[N]);
    f.close();
    g.close();
    return 0;
}