Cod sursa(job #1746534)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 23 august 2016 15:11:09
Problema Factoriale Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int MAX_DIGITS = 10000;
const int MAX_PRIME = 100;
const int NR_PRIME = 25;
bool ciur[MAX_PRIME + 5];
int prime[NR_PRIME + 5], fact[NR_PRIME + 5];
class HugeN{
    private: int x[MAX_DIGITS + 5];
    public:
        HugeN(){
            memset(x, 0, sizeof(x));
            x[0] = 1;
        }
        HugeN(int k){
            memset(x, 0, sizeof(x));
            do{
                x[++x[0]] = k % 10;
                k /= 10;
            }while (k);
        }
        void print(){
            for (int i = x[0]; i >= 1; i --)
                printf("%d", x[i]);
            printf("\n");
        }
        HugeN operator * (int k);
};
HugeN HugeN::operator * (int k){
    HugeN temp;
    int i, tr = 0, aux;
    temp.x[0] = x[0];
    for (i = 1; i <= temp.x[0]; i ++){
        aux = x[i] * k + tr;
        temp.x[i] = aux % 10;
        tr = aux / 10;
    }
    if (tr)
        temp.x[++temp.x[0]] = tr;
    return temp;
}
void PrimeN(){
    int i, j, k;
    prime[1] = 2; k = 1;
    for (i = 3; i <= MAX_PRIME; i += 2)
        if (ciur[i] == false){
            prime[++k] = i;
            for (j = i * i; j <= MAX_PRIME; j += 2 * i)
                ciur[j] = true;
        }
}
int Legendre(int n, int k){
    int aux = k, ans = 0;
    while (aux <= n){
        ans += n / aux;
        aux *= k;
    }
    return ans;
}
void Descomp(int n){
    int i;
    for (i = 1; prime[i] <= n && i <= NR_PRIME; i ++)
        fact[i] += Legendre(n, prime[i]);
}
int main(){
    freopen("factoriale.in", "r", stdin);
    freopen("factoriale.out", "w", stdout);
    int n, k, i, x, j;
    scanf("%d%d", &n, &k);
    PrimeN();
    for (i = 1; i <= n; i ++){
        scanf("%d", &x);
        Descomp(x);
    }
    HugeN a(1);
    for (i = 1; i <= NR_PRIME && fact[i]; i ++)
        for (j = 1; j <= (k - fact[i] % k) % k; j ++)
            a = a * prime[i];
    a.print();
    return 0;
}