Cod sursa(job #226415)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 1 decembrie 2008 18:20:04
Problema Factoriale Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <stdio.h>

using namespace std;

ifstream fin ("factoriale.in");
ofstream fout ("factoriale.out");

int sir[10000];
int n,k;

int rez[100000],nr,re[100000],auxnr;
int a[1000],nr1;

void div(int x)
{
     while (x%2==0)
     {
          sir[2]++;
          x>>=1;
     }
     for (int d=3;d*d<=x;d+=2)
          while (!x%d)
          {
               sir[d]++;
               x/=d;
          }
     if (x!=1)
          sir[x]++;
}

void citire()
{
     int aux;
     fin>>n>>k;
     for (int i=0;i<n;i++)
     {
          fin>>aux;
          for (int aa=2;aa<=aux;aa++)
               div(aa);
     }
}

void calc()
{
     for (int i=0;i<100;i++)
     {
          if (sir[i]%k==0)
               sir[i]=0;
          else
               sir[i]=k-(sir[i]%k);
     }
}

void inm(int x)
{
     if (x<10)
     {
          a[0]=x;
          nr1=1;
     }
     else
     {
          a[0]=x%10;
          a[1]=x/10;
          nr1=2;
     }
     int T=0;
     auxnr=nr1+nr-1;
     //memset(re,0,sizeof(re));
     for (int i=0;i<nr+nr1+1;i++)
          re[i]=0;
     for (int i=0;i<nr1;i++)
     {
          T=0;
          for (int j=0;j<nr;j++)
          {
               re[i+j]+=((rez[j]*a[i])+T);
               T=re[i+j]/10;
               re[i+j]%=10;
          }
          if (T)
          {
               re[i+nr]=T;
               if (i+nr+1>auxnr);
                    auxnr=i+nr+1;
          }
     }
}

void sch()
{
     for (int i=0;i<auxnr;i++)
          rez[i]=re[i];
     nr=auxnr;
}

void inmultire()
{
     rez[0]=1;
     nr=1;
     for (int i=2;i<100;i++)
          while (sir[i])
          {
               inm(i);
               sir[i]--;
               sch();
          }
}


int main ()
{
     citire();
     calc();
     inmultire();
     for (int i=nr-1;i>=0;i--)
          fout<<rez[i];
     fout<<"\n";
     return 0;
}