Cod sursa(job #1391483)

Utilizator Athena99Anghel Anca Athena99 Data 17 martie 2015 23:17:00
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("factoriale.in");
ofstream fout("factoriale.out");

const int pmax= 100;
const int base= 10000;

int pr;
int v[pmax+1], p[pmax+1], x[pmax+1];

void h_write( vector <int> &x ) {
    fout<<x.back();
    for ( int i= (int)x.size()-2; i>=0; --i ) {
        if ( x[i]<10 ) {
            fout<<"000";
        } else if ( x[i]<100 ) {
            fout<<"00";
        } else if ( x[i]<1000 ) {
            fout<<"0";
        }
        fout<<x[i];
    }

    fout<<"\n";
}

void hn_mult( vector <int> &x, int &y ) {
    for ( int i= 0, t= 0; i<(int)x.size() || t!=0; ++i ) {
        if ( i>=(int)x.size() ) {
            x.push_back(0);
        }

        x[i]= x[i]*y+t;
        t= x[i]/base;
        x[i]%= base;
    }
}

int main(  ) {
    for ( int i= 2; i<=pmax; ++i ) {
        if ( v[i]==0 ) {
            for ( int j= i*i; j<=pmax; j+= i ) {
                v[j]= 1;
            }
            p[++pr]= i;
        }
    }

    int n, k;
    fin>>n>>k;
    for ( int i= 1; i<=n; ++i ) {
        int a;
        fin>>a;

        for ( int j= 1; j<=pr; ++j ) {
            for ( int aux= a; aux>0; aux/= p[j] ) {
                x[j]= x[j]+aux/p[j];
            }
        }
    }

    vector <int> sol;
    sol.push_back(1);
    for ( int i= 1; i<=pr; ++i ) {
        x[i]= (k-x[i]%k)%k;
        for ( int j= 1; j<=x[i]; ++j ) {
            hn_mult(sol, p[i]);
        }
    }

    h_write(sol);

    return 0;
}