Cod sursa(job #138581)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 18 februarie 2008 21:23:26
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>

long n,k,ak,i,p[200],q,j,r,l,rez[10000],ok,nr,e[200];
long a[102],baza=1000000,exponent;

int main(){
    freopen ("factoriale.in","r",stdin);
    freopen ("factoriale.out","w",stdout);
    
    scanf("%ld %ld",&n,&ak);
    for (i=1;i<=n;i++)
        scanf("%ld",&a[i]);
    
    p[1]=2;
    p[2]=3;
    q=2;
    i=5;
    while (i<=100){
          ok=1;
          j=1;
          while (p[j]*p[j]<=i){
                if (i%p[j]==0){ok=0;break;}
                j++;
          }
          if (ok)p[++q]=i;
          i+=2;
    }
    
    for (i=1;i<=q;i++){
        nr=p[i];
        while (nr<=100){
              for (j=1;j<=n;j++)
                  e[p[i]]+=a[j]/nr;
              nr*=p[i];
        }
    }
    l=1;
    rez[1]=1;
    for (i=1;i<=q;i++)
        if (e[p[i]]%ak!=0){
           exponent=ak-e[p[i]]%ak;
           for (j=1;j<=exponent;j++){
               r=0;
               for (k=1;k<=l;k++){
                   rez[k]=rez[k]*p[i]+r;
                   r=rez[k]/baza;
                   rez[k]%=baza;
               }
               while (r){
                     l++;
                     rez[l]=r%baza;
                     r/=baza;
               }
           }
        }
    printf("%ld",rez[l]);
    for (i=l-1;i;i--)
           if (rez[i]>=100000)
                printf("%ld",rez[i]);
             else if (rez[i]>=10000)
                     printf("0%ld",rez[i]);
                  else if (rez[i]>=1000) 
                          printf("00%ld",rez[i]);
                       else if (rez[i]>=100)
                               printf("000%ld",rez[i]);
                            else if (rez[i]>=10)
                                    printf("0000%ld",rez[i]);
                                 else printf("00000%ld",rez[i]);

    printf("\n");

return 0;
}