Cod sursa(job #2522585)

Utilizator robx12lnLinca Robert robx12ln Data 12 ianuarie 2020 18:13:58
Problema Factoriale Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>
using namespace std;

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

const int Nr = 25;

int N, K;
int ans[505];
int prime[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 };
map< int, int > f;
map< int, int >::iterator  it;

inline void add( int x ){
    if( f.find(x) == f.end() )
        f[x] = 1;
    else
        f[x]++;
    return;
}

void mul( int x ){
    int t = 0;
    for( int i = 1; i <= ans[0]; i++ ){
        ans[i] = ans[i] * x + t;
        t = ans[i] / 10;
        ans[i] %= 10;
    }
    while( t != 0 ){
        ans[ ++ans[0] ] = t % 10;
        t /= 10;
    }
}

int main(){
    fin >> N >> K;
    for( int i = 1; i <= N; i++ ){
        int X; fin >> X;
        for( int x = 2; x <= X; x++ ) {
            int aux = x;
            for (int j = 0; j < Nr && aux != 1; j++) {
                while (aux % prime[j] == 0) {
                    add( prime[j] );
                    aux /= prime[j];
                }
            }
        }
    }

    ans[0] = ans[1] = 1;
    for( it = f.begin(); it != f.end(); it++ ){
        int b = (*it).first, p = (*it).second;
        if( p % K == 0 )
            continue;
        for( int i = 1; i <= K * ((p / K) + 1) - p; i++ )
            mul( b );
    }

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