Cod sursa(job #2528476)

Utilizator marius004scarlat marius marius004 Data 21 ianuarie 2020 22:32:32
Problema Factoriale Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
// Nu pricep de ce iau numai 60 :)
#include <iostream>
#include <fstream>
#include <vector>
 
std::ifstream f("factoriale.in");
std::ofstream g("factoriale.out");
 
const long long NMAX = 120;
const long long SIZE = 1000002;
std::vector<long long>primes{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};
long long n,k,v[NMAX],fr[NMAX],sol[SIZE];
 
void update(long long nr){
 
    for(long long i = 0;i < primes.size();++i){
 
        while(nr % primes[i] == 0 && nr > 1){
            fr[primes[i]]++;
            //fr[primes[i]] %= k;
            nr /= primes[i];
        }
 
        if(nr == 1)
            return;
 
        if(primes[i] > nr && nr != 1){
            fr[nr]++;
            return;
        }
    }
}
 
void multiply(long long *sol,long long value){
 
    long long t{};
    for(long long i = 1;i <= sol[0];++i){
        sol[i] = sol[i] * value + t;
        t = sol[i] / 10LL;
        sol[i] %= 10;
    }
 
    while(t){
        sol[++sol[0]] = t % 10;
        t /= 10;
    }
}
 
int main(){
 
    f >> n >> k;
 
    for(long long i = 1;i <= n;++i){
 
        f >> v[i];
 
        for(long long j = 2;j <= v[i];++j)
            update(j);
    }
 
    sol[0] = sol[1] = 1;
 
    for(long long i = 2;i <= 100;++i)
        if(fr[i] != 0 && fr[i] % k != 0)
            for(long long j = 1;j <= k - (fr[i] % k) ;++j)
                multiply(sol,i);
 
    for(long long i = (long long)sol[0];i >= 1;--i)
        g << sol[i];
 
    return 0;
}

/*
 Descompun factorialul in factori primi.exemplu 2! * 4! = 48
 2^4 * 3
 daca exponentul numarului prim % k == 0 && exp != 0 atunci nu trebuie sa fac nimic astfel inmultesc rezultatul cu prim^(k - (exp % k)).
 Inmultirea se face pe numere mari!
 */