Cod sursa(job #2113404)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 24 ianuarie 2018 15:41:49
Problema Factoriale Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>
#define ELMAX 100
using namespace std;
ifstream fin("factoriale.in");
ofstream fout("factoriale.out");
int n, k, smen[ELMAX+2], ap[ELMAX+2];
int na, nb, a[12], b[10002];
void desc(int val)
{
    int copie=val, f=3, e=0;
    while(val%2==0)
    {
        e++;
        val/=2;
    }
    ap[2]+=e*smen[copie];
    for(f=3; f*f<=copie; f+=2)
    {
        e=0;
        while(val%f==0)
        {
            e++;
            val/=f;
        }
        ap[f]+=e*smen[copie];
    }
    if(val) ap[val]=smen[copie];
}
void inmultire()
{
    int i, j, k, t, sol[10002]= {0};
    for(i=1; i<=nb; i++)
    {
        t=0;
        k=i-1;
        for(j=1; j<=na || t!=0; j++)
        {
            ++k;
            sol[k]=sol[k]+b[i]*a[j]+t;
            t=sol[k]/10;
            sol[k]%=10;
        }
    }
    for(i=1; i<=k; i++)
        b[i]=sol[i];
    nb=k;
}
void produs(int val, int putere)
{
    int i;
    memset(a,0,sizeof(a));
    na=0;
    while(val)
    {
        a[++na]=val%10;
        val/=10;
    }
    for(i=1; i<=putere; i++)
        inmultire();
}
int main()
{
    int i, x;
    fin>>n>>k;
    smen[1]=n, b[1]=1, nb=1;
    for(i=1; i<=n; i++)
    {
        fin>>x;
        smen[x+1]--;
    }
    ///SMEN
    for(i=1; i<=ELMAX; i++) smen[i]+=smen[i-1];
    for(i=2; i<=ELMAX; i++)
        if(smen[i]) desc(i);
    for(i=2; i<=ELMAX; i++)
        if(ap[i]%k!=0)
            produs(i,k-ap[i]%k);
    for(i=nb; i>=1; i--)
        fout<<b[i];
    fout<<'\n';
    return 0;
}