Cod sursa(job #3222990)

Utilizator SSKMFSS KMF SSKMF Data 12 aprilie 2024 09:40:09
Problema Factoriale Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>
using namespace std;

ifstream cin ("factoriale.in");
ofstream cout ("factoriale.out");

class Numar_Mare {
private:
    int cifre[1024] = { };
    const int baza = 10000;
public:
    Numar_Mare () { cifre[0] = cifre[1] = 1; }
    ~Numar_Mare () { }

    Numar_Mare &operator *= (const int factor) {
        int64_t transport = 0;
        for (int indice = 1 ; indice <= cifre[0] ; indice++ , transport /= baza)
            { cifre[indice] = (transport += cifre[indice] * factor) % baza; }

        for ( ; transport ; transport /= baza)
            { cifre[++cifre[0]] = transport % baza; }

        return *this;
    }
    friend ofstream &operator << (ofstream &iesire , const Numar_Mare &valoare) {
        for (int factor = valoare.baza / 10 ; factor ; factor /= 10) {
            if (factor <= valoare.cifre[valoare.cifre[0]])
                { iesire.put(valoare.cifre[valoare.cifre[0]] / factor % 10 + '0'); }
        }
        for (int indice = valoare.cifre[0] - 1 ; indice ; indice--) {
            for (int factor = valoare.baza / 10 ; factor ; factor /= 10)
                { iesire.put(valoare.cifre[indice] / factor % 10 + '0'); }
        }

        return iesire;
    }
} factor;

const 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};
int aparitii[25];

int main ()
{
    int lungime , exponent;
    cin >> lungime >> exponent;

    for (int limita ; lungime-- ; )
    {
        cin >> limita;

        for (int indice = 0 ; indice < 25 ; indice++) {
            for (int putere = prime[indice] ; putere <= limita ; putere *= prime[indice])
                { aparitii[indice] += limita / putere; }
        }
    }

    for (int indice = 0 ; indice < 25 ; indice++) {
        for (aparitii[indice] %= exponent ; aparitii[indice]-- ; )
            { factor *= prime[indice]; }
    }

    cout << factor;
    cout.close(); cin.close();
    return 0;
}