Cod sursa(job #2113001)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 24 ianuarie 2018 08:59:01
Problema Factoriale Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>
#define NRP 25
using namespace std;
int n, k, vf[102], nume[]= {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97}, f[32];
int v[12], rez[5002], nv, nrez;
void desc(int val)
{
    int e=0, valx=val;
    for(int i=1; i<=NRP; i++)
        if(val%nume[i]==0)
        {
            while(val%nume[i]==0) e++, val/=nume[i];
            f[i]=e*vf[valx];
        }
}
void inmulteste()
{
    int i, j, t, k, sol[102]= {0};
    for(i=1; i<=nrez; i++)
    {
        k=i-1;
        t=0;
        for(j=1; j<=nv || t!=0; j++)
        {
            ++k;
            sol[k]=sol[k]+rez[i]*v[j]+t;
            t=sol[k]/10;
            sol[k]%=10;
        }
    }
    for(i=1; i<=k; i++)
        rez[i]=sol[i];
    nrez=k;
}
void produs(int nr, int exp)
{
    memset(v,0,sizeof(v));
    while(nr) v[++nv]=nr%10, nr/=10;
    for(int i=1; i<=exp; i++)
        inmulteste();
}
int main()
{
    int i, x;
    freopen("factoriale.in","r",stdin);
    freopen("factoriale.out","w",stdout);
    rez[1]=1, nrez=1;
    scanf("%d%d", &n, &k);
    vf[1]=n;
    for(i=1; i<=n; i++)
    {
        scanf("%d", &x);
        vf[x+1]--;
    }
    ///smenul lui Mars
    for(i=1; i<=100; i++) vf[i]+=vf[i-1];
    for(i=2; i<=100; i++)
        if(vf[i])
            desc(i);
    for(i=1; i<=NRP; i++)
    {
        if(f[i]%k!=0)
            produs(nume[i],k-f[i]%k);
    }
    for(i=nrez; i>=1; i--)
        printf("%d", rez[i]);
    return 0;
}