Cod sursa(job #3143386)

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

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

class Numar_Mare {
    private:
        vector <long long> cifre;
        int baza = 1e8;
    public:
        Numar_Mare (int numar) {
            do cifre.emplace_back(numar % baza);
                while (numar /= baza);
        }
        ~Numar_Mare () { cifre.clear(); }

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

            while (transport) {
                cifre.emplace_back(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.back())
                    iesire << numar.cifre.back() / factor % 10;
            for (int indice = numar.cifre.size() - 2 ; indice >= 0 ; indice--)
                for (int factor = numar.baza / 10 ; factor ; factor /= 10)
                    iesire << numar.cifre[indice] / factor % 10;
            
            return iesire;
        }
};

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

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

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

        for (vector < pair <int , int> > :: iterator factor = factori.begin() ;  factor < factori.end() ; factor++)
            for (int putere = factor -> first ; putere <= limita ; putere *= factor -> first)
                (factor -> second += limita / putere) %= exponent;
    }

    Numar_Mare plus(1);
    for (vector < pair <int , int> > :: iterator factor = factori.begin() ;  factor < factori.end() ; factor++)
        while (factor -> second--) plus *= factor -> first;

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