Cod sursa(job #575169)

Utilizator borsoszalanBorsos Zalan borsoszalan Data 7 aprilie 2011 23:27:22
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#include<math.h>
int n,k,nr;
int p[64];
int v[64];
int d[128][64];
int s[1024];

int prim(int x)
{
	if(x==0 || x==1 || (x%2==0 && x!=2))
		return 0;
	int i,lim=sqrt(x);
	for(i=3;i*i<=x;i=i+2)
		if(x%i==0)
			return 0;
	return 1;
}

void gene_prim()
{
	int i;
	for(i=2;i<=100;i++)
		if(prim(i))
			p[++nr]=i;
}

void make()
{
	int i,j,ci;
	for(i=2;i<=100;i++)
	{
		ci=i;
		j=1;
		while(ci>1)
		{
			while(ci%p[j]==0)
			{
				ci=ci/p[j];
				d[i][j]++;
			}
			j++;
		}
	}
}

void read()
{
	freopen("factoriale.in","r",stdin);
	freopen("factoriale.out","w",stdout);
	scanf("%d%d",&n,&k);
	int i,a,j,x;
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a);
		for(j=2;j<=a;j++)
			for(x=1;x<=nr;x++)
				v[x]=v[x]+d[j][x];
	}
	for(i=1;i<=nr;i++)
	{
		v[i]=k-v[i]%k;
		if(v[i]==k)
			v[i]=0;
	}
}

void inm(int x)
{
	int i,t=0,lim=s[0];
	for(i=1;i<=lim || t;i++)
	{
		t=t+s[i]*x;
		s[i]=t%10;
		t=t/10;
	}
	s[0]=i-1;
}

void rez()
{
	s[++s[0]]=1;
	int i,j,lim;
	for(i=1;i<=nr;i++)
	{
		lim=v[i];
		for(j=1;j<=lim;j++)
			inm(p[i]);
	}
	for(i=s[0];i>=1;i--)
		printf("%d",s[i]);
}

int main()
{
	gene_prim();
	make();
	read();
	rez();
	return 0;
}