Cod sursa(job #327593)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 29 iunie 2009 15:49:55
Problema Factoriale Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
#include <string.h>
#define Nmax 105

int p[Nmax],prim[Nmax],exp[Nmax],c[Nmax],v[Nmax],vp[Nmax];
int n,k,x,i,z,j,aux;

void ciur(){
	int i,j;
   for(i=2;i<=10;++i)
   if(p[i]==0)
     for(j=i*i;j<=Nmax; j+=i)
       p[j]=1;
   for(i=2;i<=Nmax;++i)
     if(!p[i]) prim[++z]=i;
}

void desfa(int x){
	int i;
   for(i=1; i<=z && x; ++i)
     for( ; x % prim[i]==0; ++exp[prim[i]], x/=prim[i]);
}

void mul(int a[Nmax],int b[Nmax]){
	int i,t,j;
   memset(c,0,sizeof(c));
   for(i=1;i<=a[0]; ++i){
     for(t=0,j=1; j<=b[0] || t; ++j, t/=10)
       c[i+j-1] = (t += c[i+j-1]+a[i]*b[j] ) %10;
     if(i+j-2>c[0]) c[0]=i+j-2;
   }
}

int main(){
	ciur();
   freopen("factoriale.in","r",stdin);
   freopen("factoriale.out","w",stdout);
   scanf("%d%d",&n,&k);
   for(i=1;i<=n;++i){
   	scanf("%d",&x);
      for(j=2;j<=x;++j) desfa(j);
   }

   v[0]=1; v[1]=1;
   for(i=1;i<Nmax;++i){
     for(vp[0]=0,aux=i; aux; vp[++vp[0]]=aux%10, aux/=10);
     if(exp[i] % k !=0 )
       for(j=1; j<=k-exp[i]%k; ++j){
         mul(v,vp);
         memcpy(v,c,sizeof(c));
       }
     }

   for(i=v[0];i>=1;--i) printf("%d",v[i]);
   printf("\n");
   fclose(stdin); fclose(stdout);
   return 0;
}