Cod sursa(job #504082)

Utilizator loginLogin Iustin Anca login Data 26 noiembrie 2010 16:49:47
Problema Factoriale Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
# include <fstream>
# include <iostream>
# include <algorithm>
using namespace std;
int n, k, v[103], p[103], e[103], ex[103];
int sol[500000];

void read ()
{
	ifstream fin ("factoriale.in");
	fin>>n>>k;
	for(int i=1;i<=n;++i)
		fin>>v[i];
	sort(v+1,v+n+1);
}

void prime ()
{
	p[1]=2;
	p[0]=1;
	int pp;
	for(int i=3;i<=v[n];++i)
	{
		pp=1;
		for(int j=1;j<=p[0] && pp;++j)
			if(i%p[j]==0)
				pp=0;
		if (pp)
			p[++p[0]]=i;
	}
}

void inm (int n)
{
	long long int q, t=0;
	for(int i=1;i<=sol[0];++i)
	{
		q=n*sol[i]+t;
		sol[i]=q%10;
		t=q/10;
	}
	while(t)
	{
		sol[++sol[0]]=t%10;
		t/=10;
	}
}

void solve ()
{
	int poz=1, nr;
	for(int i=2;i<=v[n];++i)
	{
		nr=i;
		for(int j=1;j<=p[0] && nr>1;++j)
			while (nr%p[j]==0)
			{
				++e[j];
				nr/=p[j];
			}
		while (v[poz]==i)
		{
			for(int j=1;j<=p[0];++j)
				ex[j]+=e[j];
			++poz;
		}
	}
	sol[0]=sol[1]=1;
	for(int i=1;i<=p[0];++i)
		if (ex[i]%k)
			for(int j=1;j<=k-ex[i]%k;++j)
				inm(p[i]);
}

int main ()
{
	read ();
	prime ();
	solve ();
	ofstream fout ("factoriale.out");
	for(int i=sol[0];i;--i)
		fout<<sol[i];
	return 0;
}