Cod sursa(job #2734766)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 1 aprilie 2021 12:52:14
Problema Factoriale Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("factoriale.in");
ofstream fout("factoriale.out");

int fr[105][105], frT[105], rez[100005];
bool p[105];
vector<int> prime;

void inmult(int val){
    int t = 0;
    for(int i = 1; i <= rez[0]; ++i){
        rez[i] = rez[i] * val + t;
        t = rez[i] / 10;
        rez[i] %= 10;
    }

    while(t)
        rez[++rez[0]] = t % 10, t /= 10;
}

int main()
{
    for(int i = 2; i <= 100; ++i)
        if(p[i] == 0)
        {
            prime.push_back(i);
            for(int j = i + i; j <= 100; j += i)
                p[j] = 1;
        }

    for(int val = 1; val <= 100; ++val){
        int j = 0;
        while(j < (int)(prime.size()) && prime[j] <= val){
            int ax = prime[j], cnt = 0;
            while(ax <= val)
            {
                cnt += val / ax;
                ax *= prime[j];
            }
            fr[val][prime[j]] = cnt;
            ++j;
        }
    }

    int n, k;
    fin >> n >> k;

    for(int i = 1; i <= n; ++i){
        int x;
        fin >> x;

        for(int val = 1; val <= 100; ++val)
            frT[val] += fr[x][val];
    }

    rez[0] = rez[1] = 1;
    for(int val = 1; val <= 100; ++val)
        if(frT[val] > 0 && frT[val] % k != 0)
            for(int i = 1; i <= k - frT[val] % k; ++i)
                inmult(val);

    for(int i = rez[0]; i >= 1; --i)
        fout << rez[i];
    return 0;
}