Cod sursa(job #226417)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 1 decembrie 2008 18:29:29
Problema Factoriale Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <stdio.h>
#include <math.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[100000],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(long long x)
{
     auxnr=nr;
     int T=0;
     for (int i=0;i<nr1+nr+1;i++)
          re[i]=0;
          for (int j=0;j<nr;j++)
          {
               re[j]+=((rez[j]*x)+T);
               T=re[j]/10;
               re[j]%=10;
          }
          while (T)
          {
               re[auxnr++]=T;
               T/=10;
          }
}

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++)
     if (sir[i])
     {
          inm(pow(i,sir[i]));
          sch();
     }
}


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