Cod sursa(job #3208719)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 29 februarie 2024 14:41:24
Problema Factoriale Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<bits/stdc++.h>
using namespace std;
ifstream F("factoriale.in");
ofstream G("factoriale.out");
short c[]={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},i,j,a[101][98],b[101],z[9999],e[9999],f[9999],n,k,m;
void A(short a[],short b[])
{
      short i,j,t,c[9999];
      for(memset(c,0,sizeof c),i=1;i<=a[0];++i) {
            for(t=0,j=1;j<=b[0]||t;c[i+j-1]=(t+=c[i+j-1]+a[i]*(j<=b[0]?b[j]:0))%10,++j,t/=10);
            if(i+j-2>c[0])
                c[0]=i+j-2;
      }
      memcpy(a,c,sizeof c);
}
int main()
{
    for(i=2;i<101;++i) {
        for(j=0;j<25;a[i][c[j]]=a[i-1][c[j]],++j);
        for(k=i,j=0;j<25&&c[j]*c[j]<=k;++j)
            if(k%c[j]==0)
                for(k/=c[j],++a[i][c[j]];k%c[j]==0;k/=c[j],++a[i][c[j]]);
        if(k>1)
            ++a[i][k];
    }
    for(F>>n>>k;n--;)
        for(F>>m,i=0;i<25;b[c[i]]+=a[m][c[i]],++i);
    for(z[0]=z[1]=1,i=0;i<25;++i)
        if(b[c[i]]%k) {
            for(n=k-b[c[i]]%k,e[0]=e[1]=1,f[0]=0,c[i]>9?f[++f[0]]=c[i]%10,f[++f[0]]=c[i]/10:f[++f[0]]=c[i];n;A(f,f),n>>=1)
                if(n&1)
                    A(e,f);
            A(z,e);
        }
    for(i=z[0];i;G<<z[i--]);
    return 0;
}