Cod sursa(job #322420)

Utilizator Abi79Iordache Albert Abi79 Data 8 iunie 2009 20:00:39
Problema Factoriale Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<stdio.h>

FILE *in=fopen("factoriale.in","r"),*out=fopen("factoriale.out","w");

int n,k,x1,v[100],max=0;
int rez[100000];

void inmultire(int x[], int y)
{
	int i;
	unsigned long T=0;
	
	for(i=1;i<=x[0];i++)
	{
		x[i]=x[i]*y+T; 
		T=x[i]/100000; 
		x[i]=x[i]%100000; 
	}
	
	while (T) 
	{
		x[0]++;
		x[x[0]]=T%100000;
		T/=100000;
	}
}

int main()
{
	int i,j,q,aux;
	fscanf(in,"%d %d",&n,&k);
	for(i=1; i<=n; i++)
	{
		fscanf(in,"%d",&x1);
		if(x1>max) max=x1;
		for(q=2;q<=x1;q++)
		{
			aux=q;
			j=2;
			while(aux>1)
			{
				if(aux%j==0)
				{
					v[j]++;
					aux/=j;
				}
				else break;
			}
			
			j=3;
			while(aux>1)
			{
				if(aux%j==0)
				{
					v[j]++;
					aux/=j;
				}
				else
					j+=2;
			}
		}
	}
	
	rez[0]=1;
	rez[1]=1;
	
	
	
	j=2;
	if(v[j]&&v[j]%k)
	{
		if(v[j]<k)
			aux=k-(v[j]%k);
		else if (v[j]>k)
			aux=(k+v[j])-(v[j]%k);
		while(aux)
		{
			inmultire(rez,j);
			aux--;
		}
	}
	for(j=3;j<=max;j+=2)
	{
		if(v[j]<k)
			aux=k-(v[j]%k);
		else if (v[j]>k)
			aux=(k+v[j])-(v[j]%k);
		while(aux)
		{
			inmultire(rez,j);
			aux--;
		}
	}
	

	
	for(i=rez[0];i>0;i--)
		fprintf(out,"%d",rez[i]);
	fclose(out);
	return 0;
}