Cod sursa(job #137307)

Utilizator IoannaPandele Ioana Ioanna Data 17 februarie 2008 11:09:50
Problema Factoriale Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 9-a Marime 1.54 kb
#include<stdio.h>
#include<string.h>
int n,k,x[110];
int p[]={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 f[100];
int a[10],b[499000],c[499000];

void read()
{
int i;
scanf("%d%d",&n,&k);
for (i=1;i<=n;i++)
    scanf("%d",&x[i]);
}

void factp()
{
int i,j;
int k,lim,e,t;
for (i=1;i<=n;i++)
    {
     lim=x[i]/p[1];
     j=1;
     e=p[1];
     while (lim)
	   {
	    t=lim;
	    if (f[0]<j)
	       f[0]=j;
	    while (t)
		  {
		   f[j]+=t;
		   e*=p[j];
		   t=x[i]/e;
		  }
	    j++;
	    lim=x[i]/p[j];
	   }

    }
}

void numar()
{
int i;
for (i=1;i<=f[0];i++)
    {
     if (f[i])
       {
	if (f[i]%k!=0)
	 f[i]=(f[i]/k+1)*k-f[i];
	else f[i]=0;
	}
    }
}

void produs()
{
int i,j,t;

    memset(c,0,sizeof(c));
    c[0]=a[0]+b[0]-1;
    for (i=1;i<=a[0];i++)
	for (j=1;j<=b[0];j++)
	    c[i+j-1]=c[i+j-1]+a[i]*b[j];
   t=0;
   for (i=1;i<=c[0];i++)
       {c[i]=c[i]+t;
	t=c[i]/10;
	c[i]=c[i]%10;
	}
   if (t)
      {
      c[++c[0]]=t;
      }

}

void calc()
{
int i,j,k,l,m,h,q;
b[1]=1;
	 b[0]=1;
for (i=1;i<=f[0];i++)
    {
     if (f[i])
	{
	 a[0]=0;

	 do
	 {
	  a[++a[0]]=p[i]%10;
	  p[i]/=10;
	 }
	 while (p[i]);
	 for (l=1;l<=f[i];l++)
	     {

	      produs();
	      memcpy(b,c,sizeof(c));
	     }

	}
    }
    for (i=c[0];i>=1;i--)
	printf("%d",c[i]);

}

int main()
{
freopen("factoriale.in","r",stdin);
freopen("factoriale.out","w",stdout);
read();
factp();
numar();
calc();
fcloseall();
return 0;
}