Cod sursa(job #1777691)

Utilizator giotoPopescu Ioan gioto Data 12 octombrie 2016 20:04:47
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#define MOD 1000
using namespace std;

int NR, n, k, x, p[104], a[100004], F[104];
bool f[110];
inline void Ciur(){
    p[++NR] = 2;
    for(int i = 3; i <= 105 ; i += 2){
        if(f[i] == 0){
            p[++NR] = i;
            for(int j = i * 3; j <= 105 ; j += i * 2)
                f[j] = 1;
        }
    }
}
inline void INM(int b){
    int T = 0;
    for(int i = 1; i <= a[0]; ++i){
        a[i] = a[i] * b + T;
        T = a[i] / MOD;
        a[i] %= MOD;
    }
    while(T > 0){
        a[++a[0]] = T % MOD;
        T = T / MOD;
    }
}
int main()
{
    freopen("factoriale.in", "r", stdin);
    freopen("factoriale.out", "w", stdout);
    scanf("%d%d", &n, &k);
    Ciur();

    for(int i = 1; i <= n ; ++i){
        scanf("%d", &x);
        for(int j = 1; j <= NR && p[j] <= x; ++j){
            int y = p[j];
            while(y <= x){
                F[j] = F[j] + x / y;
                y *= p[j];
            }
        }
    }
    a[0] = 1; a[1] = 1;
    for(int i = 1; i <= NR ; ++i){
        if(F[i] % k != 0){
            int REST = k - (F[i] % k);
            for(int j = 1; j <= REST; ++j)
                INM(p[i]);
        }
    }
    printf("%d",a[a[0]]);
    for(int i = a[0] - 1; i >= 1; --i){
        int aux = a[i];
        if(a[i] == 0){
            printf("000");
            continue ;
        }
        while(a[i] < 100)
            a[i] *= 10, printf("0");
        printf("%d", aux);
    }
    return 0;
}