Cod sursa(job #374144)

Utilizator titusuTitus C titusu Data 16 decembrie 2009 10:15:20
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
using namespace std;
#include <fstream>
#include <iostream>

int prime[105],putere[105],n,k,e[105],nrp;
typedef int NrMare[10000];


void desc(int j){
	int d=1,p=0;
	while(j%prime[d]==0)
		p++,j/=prime[d];
	putere[prime[d]] += p;
	d=2;
	while(j>1){
		p=0;
		while(j%prime[d]==0)
			p++,j /= prime[d];
		putere[prime[d]] += p;
		d++;
		if(prime[d]*prime[d]>j && j>1)
			putere[j] +=1, j=1;
	}
}

void Produs(NrMare a,int x){
	int t=0,i,tmp;
	for(i=1;i<=a[0];++i){
		tmp=a[i]*x+t;
		a[i]=tmp%10;
		t=tmp/10;
	}
	while(t)
		a[++a[0]]=t%10 , t/=10;
}

void Scrie(NrMare a, ostream& out){
	for(int i=a[0];i;--i)
		out<<a[i];
	out<<endl;
}

int main(){
	int i,j,x;
	e[0]=e[1]=1;
	for(i=2;i*i<=100;++i)
		if(e[i]==0)
			for(j=2;i*j<=100;++j)
				e[i*j]=1;
	for(i=1;i<=100;++i)
		if(e[i]==0)
			prime[++nrp]=i;
	cout<<endl;
	ifstream fin("factoriale.in");
	fin>>n>>k;
	for(i=1;i<=n;i++){
		fin>>x;
		for(j=2;j<=x;j++)
			desc(j);
	}
	for(i=1;i<=nrp;i++){
		x=putere[prime[i]];
		if(x%k==0)
			j=0;
		else
			j=k*(x/k+1)-x;
		putere[prime[i]]=j;
	}
	//for(i=1;i<=nrp;i++)
	//	cout<<"("<<prime[i]<<" "<<putere[prime[i]]<<") ";
	//cout<<endl;
	NrMare a;
	a[0]=1;a[1]=1;
	for(i=1;i<=nrp;++i){
		x=putere[j=prime[i]];
		for(k=1;k<=x;k++)
			Produs(a,j);
	}
	ofstream fout("factoriale.out");
	Scrie(a,fout);
	return 0;
}