Cod sursa(job #251003)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 1 februarie 2009 15:58:14
Problema Factoriale Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <stdio.h>      
#include <string.h>  

#define Base 1000000000   
     
int prim[123],x,n,k,i,d,e,j,rez[123],p[123],max,pp,rez1[123];      
     
void fact(int a)      
{      
    e=0;      
    d=2;      
    while(a%d==0)      
    {      
        a/=d;      
        e++;      
    }      
    if (e>0)      
    prim[d]+=e; 
    d=3;      
    while(a!=1)      
    {      
        e=0;      
        while(a%d==0)      
        {      
            a/=d;      
            e++;      
        }      
        if (e>0)      
        prim[d]+=e;   
    d+=2;      
    }      
}      
   
void init(int cif) 
{   
  p[0]=0;   
  while (cif) 
  {   
      ++p[0];   
      p[p[0]]=cif%Base;   
      cif/=Base;   
  }   
}  

void mul1(int A[], int B)   
{   
      int i, t = 0;   
      for (i = 1; i <= A[0] || t; i++, t /= Base)   
              A[i] = (t += A[i] * B) % Base;   
      A[0] = i - 1;   
}  

  

void mul(int A[], int B[])   
{   
      int i, j, t, C[123];   
      memset(C,0,sizeof(C));   
      for (i=1;i<=A[0];++i)   
      {   
              t=0;  
              for (j=1;j<=B[0] || t;++j,t/=Base)   
                      C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%Base;   
              if (i+j-2>C[0]) C[0]=i+j-2;   
      }   
      memcpy(A,C,sizeof(C));   
}  

     
int main()      
{      
    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)      
              fact(j);      
    }    
    rez[0]=1;  
    rez[1]=1;      
    for (i=2;i<=100;++i)      
          if (prim[i]>0)      
               {
                  if (prim[i]%k!=0)
                  {
                  pp=1;      
                  p[0]=p[1]=1;
                  for (j=1;j<=k-(prim[i]%k);++j)   
                        pp*=i;
                        mul1(p,pp);
                        //init(pp);   
                        mul(rez,p);
                  }        
               }      
    printf("%d", rez[rez[0]]);
    for (i=rez[0]-1;i>=1;--i)
          printf("%.09d",rez[i]);                     
    return 0;      
}