Cod sursa(job #138437)

Utilizator marius135Dumitran Adrian Marius marius135 Data 18 februarie 2008 17:20:31
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<stdio.h>
#define baza 10000000
#define maxl 100000

long sol[maxl+4];
long n,k,nr;


long prim[128],v[128];

void ciur()
{
	
	for(long i = 2; i <= 100; ++i)
	{
		long ok = 1;
		for(long  j = 2; j*j<=i; ++j)
			if(i%j == 0)
			{
				ok = 0;
				break;
			}
		if(ok)
			prim[++nr] = i;
	}			
}
void baga(long w)
{
	for( long i = 1; i <= nr && w > 1; ++i)
	{
		while(w % prim[i] == 0)
		{
			v[i]++;
			w/=prim[i];
		}
	}
}

void prod(long *a,long val)
{
	for(long i = maxl; i >= a[0]; --i)
	{
		a[i] = a[i] * val + a[i+1]/baza;
		a[i+1]%=baza;
	}
	if(a[a[0]]>=baza)
	{
		a[0]--;
		a[a[0]]= a[a[0]+1]/baza;
		a[a[0]+1]%=baza;
	}
	
	
}
void afisare(long *w)
{
	printf("%ld",w[w[0]]);
	for(long i = w[0]+1; i <= maxl; ++i)
	{
		printf("%07ld",w[i]);
	}
}

int main()
{
	freopen("factoriale.in","r",stdin);
	freopen("factoriale.out","w",stdout);
	
	ciur();
	scanf("%ld %ld",&n,&k);
	for( long i = 1; i <= n; ++i)
	{
		long w;
		scanf("%ld",&w);
		for(long j = 1; j <= w; ++j)
			baga(j);
			
	}
	sol[maxl] = 1;
	sol[0] = maxl;
	for( long i = 1; i <= nr; ++i)
	{
		long a = k-v[i]%k;
		if(a == k) continue;
		for( ; a; --a)
		{
			//sol*=prim[i];
			prod(sol,prim[i]);
		}
	}
	afisare(sol);
//	printf("%lld\n",sol);
	
	
	
	
	return 0;
}