Cod sursa(job #137961)

Utilizator FlorianFlorian Marcu Florian Data 17 februarie 2008 18:23:14
Problema Factoriale Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<stdio.h>
#include<string.h>
#define Max 100
FILE*f=fopen("factoriale.in","r");
FILE*g=fopen("factoriale.out","w");
int x[105],n,k;
int u[104],p;
int a[104];
int frecv[103];
int sol[10004];
int aux[10005];
void read()
 {
 fscanf(f,"%d %d",&n,&k);
 int i;
 for(i=1;i<=n;++i) fscanf(f,"%d",&x[i]);
 }
void precalc()
  {
  int i,j;
  for(i=2;i<=Max;i+=2) u[i]=1;
  a[1]=2;
  p=1;
  for(i=3;i<=Max;i+=2)
   {
   if(u[i]==0)
     {
     a[++p]=i;
     for(j=2;i*j<=Max;u[i*j]=1,++j);
     }
   }
 }
int bug(int a[], int n)
  {
  int i;
  for(i=1;i<=n;++i) fprintf(g,"%d ",a[i]);
  fprintf(g,"\n");
  }
int descomp(int n, int p) //puterea la care apare p in n!
  {
  int nr=0,pr=1;
  while(n/pr!=0)
    {
    nr+=(n/pr);
    pr*=p;
    }
 return nr;
  }
void calcul()
  {
  int nr,i,j;
  for(i=1;i<=n;++i)
    for(j=1;j<=p;++j)
     {
     nr=descomp(x[i],a[j]);
     frecv[j]+=nr;
     }
  }
void inmulteste(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 inmultire(int A[], int B[])
{
      int i, j, t, C[1000];
      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));
}

void det_sol()
  {
  int i,j;
  sol[0]=sol[1]=1;
  for(i=1;i<=p;++i)
    if(frecv[i] && frecv[i]%k)
       {
       //sol=sol*(a[i]^(k-frecv[i]%k))
       memset(aux,0, sizeof(aux));
       aux[0]=aux[1]=1;
       for(j=1;j<=k-frecv[i]%k;++j)
          inmulteste(aux,a[i]);
       inmultire(sol,aux);
       }
   }
void afis()
  {
  int i,j;
  for(i=sol[0];i>0;--i) fprintf(g,"%d",sol[i]);
  }
int main()
 {
 read();
 precalc();
 calcul();
 det_sol();
 afis();
 return 0;
 }