Cod sursa(job #1894737)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 27 februarie 2017 14:03:26
Problema Factoriale Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include<bits/stdc++.h>
using namespace std;
int n,k,v[105],nr[10005],baza[10005],sol[10005],m,prime[105],dp,e[105],t;
bool ciur[105];
inline int max(int a,int b)
{
    return a>b?a:b;
}
void inmulteste(int a[],int b[])
{
    int c[10000],t=0;
    memset(c,0,sizeof(c));
    for(int i=1;i<=a[0];i++)
    {
        int j;
        for(j=1;j<=b[0] || t;j++)
        {
            t+=(c[i+j-1]+a[i]*b[j]);
            c[i+j-1]=t%10;
            t/=10;
        }
        if((i+j-2)>c[0]) c[0]=i+j-2;
    }
    memcpy(a,c,sizeof(c));
}
void conversie(int a[],int x)
{
    memset(a,0,sizeof(a));
    int da=0;
    while(x)
    {
        a[++da]=x%10;
        x/=10;
    }
    a[0]=da;
}
void afiseaza(int a[])
{
    for(int i=a[0];i>=1;i--) printf("%d",a[i]);
    printf("\n");
}
int main()
{
    freopen("factoriale.in","r",stdin);
    freopen("factoriale.out","w",stdout);
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&v[i]);
        m=max(m,v[i]);
    }
    for(int i=4;i<=m;i+=2) ciur[i]=1;
    for(int i=3;i<m;i+=2)
        if(!ciur[i])
            for(int j=i+i;j<=m;j+=i) ciur[j]=1;
    for(int i=2;i<=m;i++)
        if(!ciur[i]) prime[++dp]=i;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=dp;j++)
        {
        int x=prime[j];
        int ex=0;
        while(x<=v[i])
        {
            ex=ex+(v[i]/x);
            x=x*prime[j];
        }
        e[j]+=ex;
        }
    }
    for(int i=1;i<=dp;i++)
        e[i]=(k-(e[i]%k))%k;
    conversie(sol,1);
    for(int i=1;i<=dp;i++)
    {
        t=e[i];
        if(t)
        {
        conversie(nr,1);
        conversie(baza,prime[i]);
        while(t)
        {
            if(t&1)
            {
                inmulteste(nr,baza);
                t--;
            }
                else
            {
                inmulteste(baza,baza);
                t>>=1;
            }
        }
        inmulteste(sol,nr);
        }
    }
    afiseaza(sol);
    return 0;
}