Cod sursa(job #318143)

Utilizator Andrei200Andrei200 Andrei200 Data 26 mai 2009 23:55:05
Problema Factoriale Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <stdio.h>         
#include <string.h>     
  
#define Base 10      
        
int prim[323],x,n,k,i,d,e,j,rez[323],p[323],max,pp,rez1[323];         
        
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[323];      
      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];i>=1;--i)   
          printf("%d",rez[i]);                        
    return 0;         
}