Cod sursa(job #351985)

Utilizator chrissBota Cristian chriss Data 29 septembrie 2009 22:41:58
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>
#include <string.h>
#define DIM 10005

const int  p[25]={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 n,k,x,i,j,e,v[25],rez[DIM],q[25],aux;

void trans (int nr,int a[DIM])
{
    for ( ; nr; nr/=10)
        a[++a[0]]=nr%10;
}

void mult (int a[DIM],int b[DIM])
{
    int c[DIM];
    int i,j,t;
    
    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 solve ()
{
    int aux1[DIM],aux2[DIM];
    int i,put;
    
    rez[0]=rez[1]=1;
    for (i=0; i<25; ++i)
    {
        memset (aux1,0,sizeof (aux1));
        memset (aux2,0,sizeof (aux2));
        aux1[0]=aux1[1]=1;
        trans (p[i],aux2);
        for (put=v[i]; put; put/=2)
        {
            if (put%2==1)
                mult (aux1,aux2);
            mult (aux2,aux2);
        }
        mult (rez,aux1);
    }
}

void print ()
{
    int i;
    
    for (i=rez[0]; i; --i)
        printf ("%d",rez[i]);
}

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++)
		{
			aux=j;
			e=0;
			while(aux>1)
			{
				if(aux%p[e]==0)

					while(aux%p[e]==0)
					{
						q[e]++;
						aux=aux/p[e];
					}
			e++;
			}
		}
	}
i=0;
while(q[i]!=0)
{
    if(q[i]%k!=0)
        while(q[i]%k!=0)	
        { 
            v[i]++;
		    q[i]++;					
      }		    
 i++;
}
	solve ();
    print ();

return 0;
}