Cod sursa(job #250995)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 1 februarie 2009 15:38:39
Problema Factoriale Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <stdio.h>      
#include <string.h>     
     
int prim[123],x,n,k,i,d,e,j,rez[123],p[123],max;      
     
void fact(int a)      
{      
    e=0;      
    d=2;      
    while(a%d==0)      
    {      
        a/=d;      
        e++;      
    }      
    if (e>0)      
    prim[d]+=e; 
    d=3;      
    while(d*d<=a)      
    {      
        e=0;      
        while(a%d==0)      
        {      
            a/=d;      
            e++;      
        }      
        if (e>0)      
        prim[d]+=e;   
    d+=2;      
    }      
}      
   
void init(int cif)   
{
 int i,t=0;   
 for(i=1;i<=p[0]||t;++i)   
    { 
      t+=p[i]*cif;   
      p[i]=t%10;   
      t/=10;   
    }   
    p[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)   
      {   
              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;   
      }   
      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)
                  {
                  p[0]=1;      
                  p[1]=1;
                  for (j=1;j<=k-(prim[i]%k);++j)   
                        init(i);   
                        mul(rez,p);
                  }        
               }      
    printf("%d", rez[rez[0]]);
    for (i=rez[0]-1;i>=1;--i)
          printf("%d",rez[i]);                     
    return 0;      
}