Cod sursa(job #1143683)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 15 martie 2014 20:42:07
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <cstdio>

using namespace std;

int fr[105][105],p[105],sol[100005],pr[100005],aux[100005];

inline void PreCalcul()
{
    int i,n,d;
    for(i=1;i<=100;++i)
    {
        n=i;
        while(n%2==0)
        {
            ++fr[i][2];
            n/=2;
        }
        d=3;
        while(n>1 && d*d<=n)
        {
            while(n%d==0)
            {
                ++fr[i][d];
                n/=d;
            }
            d+=2;
        }
        if(n>1)
            ++fr[i][n];
    }
}

inline void Inmultire(int a[], int p)
{
    int x=0,r=0,i;
    for(i=1;i<=a[0];++i)
    {
        x=r+a[i]*p;
        a[i]=x%10;
        r=x/10;
    }
    while(r)
    {
        a[++a[0]]=r%10;
        r/=10;
    }
}

inline void InmultireMare(int a[], int b[], int c[])
{
    int i,j,T=0;
    c[0]=a[0]+b[0]-1;
    for(i=1;i<=c[0];++i)
        c[i]=0;
    for(i=1;i<=a[0];++i)
        for(j=1;j<=b[0];++j)
            c[i+j-1]+=a[i]*b[j];
    for(i=1;i<=c[0];++i)
    {
        T=(c[i]+=T)/10;
        c[i]%=10;
    }
    if(T)
        c[++c[0]]=T;
}

int main()
{
    int N,K,i,r,x,j,k;
    freopen ("factoriale.in","r",stdin);
    freopen ("factoriale.out","w",stdout);
    PreCalcul();
    scanf("%d%d", &N,&K);
    for(i=1;i<=N;++i)
    {
        scanf("%d", &x);
        for(j=1;j<=x;++j)
            for(k=1;k<=100;++k)
                p[k]+=fr[j][k];
    }
    sol[0]=sol[1]=1;
    for(i=1;i<=100;++i)
    {
        r=p[i]%K;
        if(r)
            r=K-r;
        pr[0]=pr[1]=1;
        for(j=1;j<=r;++j)
            Inmultire(pr,i);
        InmultireMare(sol,pr,aux);
        sol[0]=aux[0];
        for(j=1;j<=sol[0];++j)
            sol[j]=aux[j];
    }
    for(i=sol[0];i;--i)
        printf("%d", sol[i]);
    printf("\n");
    return 0;
}