Cod sursa(job #333817)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 23 iulie 2009 22:46:08
Problema Factoriale Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <stdio.h>
#define N 100
#define P 100000
#define NR 10000
int fact[N],prim[N],r,rez[P];
int n,k;
char prime(int x)
{
	if (x==1)
		return 0;
	if (x==2)
		return 1;
	if (x%2==0)
		return 0;
	int i;
	for (i=3; i*i<=x; i+=2)
		if (x%i==0)
			return 0;
	return 1;
}
void precalculate()
{
	int i;
	for (i=2; i<=N; i++)
		if (prime(i))
			prim[++r]=i;
}
int cbin(int x)
{
	int st=1,dr=r,m;
	while (st!=dr)
	{
		m=(st+dr)/2;
		if (x<=prim[m])
			dr=m;
		else
			st=m+1;
	}
	if (prim[st]>x)
		--st;
	return st;
}
void actualize(int x,int y)
{
	int nr,numar;
	numar=prim[x];
	nr=prim[x];
	while (nr<=y)
	{
		fact[numar]+=y/nr;
		nr*=numar;
	}
}
void prelucreaza()
{
	int x,i,poz;
	scanf("%d",&x);
	poz=cbin(x);
	for (i=1; i<=poz; i++)
		actualize(i,x);
}
void mul(int A[], int B)
{
      int i, t = 0;
      for (i = 1; i <= A[0] || t; i++, t /= NR)
              A[i] = (t += A[i] * B) % NR;
      A[0] = i - 1;
}
int nrcif(int x)
{
	int cont=0;
	while (x)
	{
		cont++;
		x/=10;
	}
	return cont;
}
int main()
{
	freopen("factoriale.in","r",stdin);
	freopen("factoriale.out","w",stdout);
	precalculate();
	scanf("%d%d",&n,&k);
	int i,j,t;
	for (i=1; i<=n; i++)
		prelucreaza();
	rez[0]=1;
	rez[1]=1;
	for (i=1; i<=r; i++)
	{
		fact[prim[i]]%=k;
		if (fact[prim[i]]!=0)
			for (j=1; j<=k-fact[prim[i]]; j++)
				mul(rez,prim[i]);
	}
	for (i=rez[0]; i>=1; i--)
	{
		if (i!=rez[0])
		{
			t=nrcif(rez[i]);
			if (t<4)
				for (j=1; j<=4-t; j++)
					printf("0");
		}
		printf("%d",rez[i]);
	}
	return 0;
}