Cod sursa(job #2910900)

Utilizator MrPuzzleDespa Fabian Stefan MrPuzzle Data 25 iunie 2022 17:52:10
Problema Factoriale Scor 80
Compilator cpp-64 Status done
Runda 3_iulie Marime 1.78 kb
#include <fstream>
#include <iostream>
#include <algorithm>

using namespace std;


//ifstream f("in.in");
//ofstream g("out.out");

ifstream f("factoriale.in");
ofstream g("factoriale.out");

int n,k,x;

int prime[105],ciurk=0;
int u[105],bonusu[105];
bool ciur[105];

void make_ciur(){
    for(int i=2;i<=100;i++){
        if(ciur[i]==0){
            for(int j=2;i*j<=100;j++){
                ciur[i*j] = 1;
            }
        }
    }
    for(int i=2;i<=100;i++){
        if(ciur[i]==0){
            ciurk++;
            prime[ciurk] = i;
        }
    }
}

void add_div_fact(int x){
    for(int i=1;prime[i] <= x && i<= ciurk;i++){
        int d = prime[i];
        while(x>=d){
            u[i]+=x/d;
            d *= prime[i];
        }
    }
}

int sol[1005];

void afisare(){
    for(int i=sol[0];i>=1;i--){
        g<<sol[i];
    }
}

void afisaretest(){
    for(int i=sol[0];i>=1;i--){
        cout<<sol[i];
    }
    cout<<'\n';
}

void inmultire(int x){
    int prod,t=0,i;
    for(i=1;i<=sol[0] || t!=0;i++){
        prod = x * sol[i] + t;
        sol[i] = prod%10;
        t = prod/10;
    }
    sol[0] = i-1;
    //afisaretest();
}

int main(){

    make_ciur();

    f>>n>>k;
    for(int i=1;i<=n;i++){
        f>>x;
        add_div_fact(x);

        /*cout<<"test"<<'\n';
        for(int j=1;j<=ciurk;j++){
            cout<<u[j]<<" ";
        }
        cout<<'\n';*/
    }

    for(int i=1;i<=ciurk;i++){
        if(u[i]%k!=0){
            bonusu[i] = k - u[i]%k;
        }
    }

    sol[0] = 1;
    sol[1] = 1;
    for(int i=1;i<=ciurk;i++){
        for(int j=1;j<=bonusu[i];j++){
            inmultire(prime[i]);
        }
    }

    afisare();

    f.close();
    g.close();
    return 0;
}