Cod sursa(job #3143382)

Utilizator SSKMFSS KMF SSKMF Data 29 iulie 2023 16:01:36
Problema Factoriale Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <fstream>
using namespace std;

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

class Numar_Mare {
    private:
        long long cifre[10000] , baza = 1e8;
    public:
        Numar_Mare (int numar) {
            cifre[0] = 0;
            do cifre[++cifre[0]] = numar % baza;
                while (numar /= baza);
        }

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

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

            return *this;
        }

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

pair <int , int> factor[] = {make_pair(2 , 0) , make_pair(3 , 0) , make_pair(5 , 0) , make_pair(7 , 0) , make_pair(11 , 0) , make_pair(13 , 0) , make_pair(17 , 0) , make_pair(19 , 0) , make_pair(23 , 0) , make_pair(29 , 0) , make_pair(31 , 0) , make_pair(37 , 0) , make_pair(41 , 0) , make_pair(43 , 0) , make_pair(47 , 0) , make_pair(53 , 0) , make_pair(59 , 0) , make_pair(61 , 0) , make_pair(67 , 0) , make_pair(71 , 0) , make_pair(73 , 0) , make_pair(79 , 0) , make_pair(83 , 0) , make_pair(89 , 0) , make_pair(97 , 0)};

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

    for (int indice = 1 , limita ; indice <= lungime ; indice++)
    {
        cin >> limita;

        for (int indice_2 = 0 ; indice_2 < 25 && factor[indice_2].first <= limita ; indice_2++)
            for (int putere = factor[indice_2].first ; putere <= limita ; putere *= factor[indice_2].first)
                (factor[indice_2].second += limita / putere) %= limita;
    }

    Numar_Mare plus(1);
    for (int indice = 0 ; indice< 25 ; indice++)
        while (factor[indice].second--)
            plus *= factor[indice].first;

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