Cod sursa(job #1357137)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 23 februarie 2015 19:40:08
Problema Factoriale Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <bitset>

using namespace std;

ifstream fin("factoriale.in");
ofstream fout("factoriale.out");
bitset <103> ciur;
int prim[100],N,k,x[100],a[100],f[100],m,K;
int sol[200];
int getfact(int x,int y){
    int nr=0;
    int a=x;
    while(a<=y){
        nr=(nr+y/a)%K;
        a*=x;
    }
    return nr;
}
void getprime(){
    ciur[0]=ciur[1]=1;
    for(int i=2;i<=100;i++){
        if(!ciur[i]){
            prim[++k]=i;
            for(int j=i+i;j<=100;j+=i)
                ciur[j]=1;
        }
    }
}
int main(){
    fin>>N>>K;
    for(int i=1;i<=N;i++)
        fin>>x[i];
    getprime();
    for(int i=1;i<=k;i++){
        for(int j=1;j<=N;j++){
            if(prim[i]<=x[j]){
                if(a[m]!=prim[i])
                    a[++m]=prim[i];
                f[m]=(f[m]+getfact(prim[i],x[j]))%K;
            }
        }
    }
    sol[0]=sol[1]=1;
    for(int i=1;i<=m;i++)
        if(f[i]!=0){
            int b=K-f[i];
            while(b--){
                int t=0;
                for(int j=1;j<=sol[0];j++){
                    sol[j]=sol[j]*a[i]+t;
                    t=sol[j]/10;
                    sol[j]%=10;
                }
                while(t!=0){
                    sol[++sol[0]]=t%10;
                    t/=10;
                }
            }
        }
    for(int i=sol[0];i>=1;i--)
        fout<<sol[i];
    fin.close();fout.close();
    return 0;
}