Cod sursa(job #658907)

Utilizator CS-meStanca Marian Ciprian CS-me Data 9 ianuarie 2012 19:41:29
Problema Factoriale Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<stdio.h>
#include<string.h>
FILE *fin=fopen("factoriale.in","r");
FILE *fout=fopen("factoriale.out","w");
int prim[]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
int exp[30],rez[200],a[200],n,k,i,j,p,x;

void X_mic(int a[], int b){
int i,t=0;
      for(i=1; i<=a[0] || t ; i++,t/=10)
              a[i] = (t += a[i] * b) % 10;
      a[0] = i - 1;
}


void X_mare(int A[],int la, int B[],int lb){
int i, j, t, C[200];
      memset(C, 0, sizeof(C));
      for(i = 1; i <= la; i++){
              for(t=0, j=1; j <= lb || 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(){

    fscanf(fin,"%d %d",&n,&k);

    for(i=1;i<=n;i++){
        fscanf(fin,"%d",&x);

        for(j=1;prim[j]<=x;j++){
            p=prim[j];
            while(p<=x){
                exp[j]+=x/p;
                p*=p;
            }
        }
    }

    for(i=1;i<=25;i++){
        if(exp[i]%k>0){
            exp[i]=k-( exp[i]%k );
        }
        else exp[i]=0;
    }

    rez[1]=1;
    rez[0]=1;

    for(i=1;i<=25;i++){
        if(exp[i]!=0){

            if(prim[i]>=10){
                a[0]=2;
                a[1]=prim[i]%10;
                a[2]=prim[i]/10;
            }
            else{
                a[0]=1;
                a[1]=prim[i];
            }

            for(p=2;p<=exp[i];p++){
                X_mic(a,prim[i]);
            }

            X_mare(rez,rez[0],a,a[0]);

            memset(a,0,sizeof(a));

        }
    }

    for(i=rez[0];i>=1;i--){
        fprintf(fout,"%d",rez[i]);
    }
return 0;
}