Cod sursa(job #209154)

Utilizator mordredSimionescu Andrei mordred Data 20 septembrie 2008 23:35:46
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>
#include <fstream.h>
#define BASE 10
typedef int Huge[512];

void Mult(Huge H, unsigned long X){ 
  int i;
  unsigned long T=0;
  for (i=1;i<=H[0];i++)
    { H[i]=H[i]*X+T;
      T=H[i]/10;
      H[i]=H[i]%10;
    }
  while (T)
    { H[++H[0]]=T%10;
      T/=10;
    }
}

int n,k;
int a[101],b[101];
bool flag[101];
int i,j,aux,counter;
Huge x;

int main(){
 freopen("factoriale.in","r",stdin);
 freopen("factoriale.out","w",stdout);
 
 scanf("%d %d",&n,&k);
 
 for(i=0;i<n;++i)
    scanf("%d",&aux),
    ++b[aux];
 
 for(i=2;i<=100;++i)
    for(j=2;j<=i;++j)
        a[j]+=b[i];
 
 for(i=4;i<=100;++i)
    b[i] = 0;
 
 b[2]=a[2];
 b[3]=a[3];
 
 for(i=4;i<=100;++i)
    if(a[i])                //daca nr i exista in sir, ii cauta factori primi si ii memoreaza in tabloul b
        {
        aux = i;
        for(j=2;j<=i&&aux>1;++j) // aux e descompus in factori primi
            if(!(aux%j))
                {
                counter = 0;
                while(aux/j&&!(aux%j))
                    aux /= j,
                    ++counter;
                b[j] += counter * a[i];
                }
        }
 
 x[0]=x[1]=1;
 
 for(i=2;i<=100;++i)
    {
    if(b[i]%k)
        b[i] = k - b[i] % k;
    else
        b[i] = 0;
    while(b[i])
        {
        Mult(x,i);
        --b[i];
        }
    }
 
 for(i=x[0];i;--i)printf("%d",x[i]);
 
 return 0;
}