Cod sursa(job #504079)

Utilizator ChallengeMurtaza Alexandru Challenge Data 26 noiembrie 2010 16:46:41
Problema Factoriale Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <fstream>
#include <vector>

using namespace std;

const char InFile[]="factoriale.in";
const char OutFile[]="factoriale.out";
const int MaxN=105;

ifstream fin(InFile);
ofstream fout(OutFile);

inline int legendre(int x,int p)
{
	int d=p;
	int t=x/d;
	int rez=0;
	while(t)
	{
		rez+=t;
		d=d*p;
		t=x/d;
	}
	return rez;
}

int n,k,x,v[MaxN];
char pciur[MaxN];
vector<int> nrp;
int nr[MaxN];

inline void ciur()
{
	for(register int i=2;i<MaxN;++i)
	{
		if(pciur[i]==0)
		{
			nrp.push_back(i);
			for(register int j=i<<1;j<MaxN;j+=i)
			{
				pciur[j]=1;
			}
		}
	}
}

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

int main()
{
	ciur();
	fin>>n>>k;
	for(register int i=1;i<=n;++i)
	{
		fin>>x;
		for(register int j=0;j<(int)nrp.size() && nrp[j]<=x;++j)
		{
			v[j]+=legendre(x,nrp[j]);
		}
	}
	fin.close();

	nr[0]=1;
	nr[1]=1;
	for(register int i=0;i<MaxN;++i)
	{
		if(v[i]%k!=0)
		{
			v[i]=k-v[i]%k;
			for(register int j=0;j<v[i];++j)
			{
				mul(nr,nrp[i]);
			}
		}
	}

	for(register int i=nr[0];i>0;--i)
	{
		fout<<nr[i];
	}
	fout.close();
	return 0;
}