Cod sursa(job #361869)

Utilizator funkydvdIancu David Traian funkydvd Data 6 noiembrie 2009 22:01:17
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<fstream>
using namespace std;
ifstream f1 ("gfact.in");
ofstream f2 ("gfact.out");
long long p,q,nr;
long long t[100], pt[100];
long long b[100];
void desc()
{
	long long i;
	nr=1;
	for (i=2; i*i<=p; i++)
	{
		while (p%i==0) {pt[nr]++; p/=i;}
		if (pt[nr]!=0) {t[nr]=i; nr++;}
	}
	if (p!=1) {pt[nr]=1; t[nr]=p;}
		else nr--;
}
int calc(int k, int poz)
{
	long long x=k*t[poz];
	long long putere=k;
	long long v=t[poz];
	long long r=k;
	while (r) {v*=t[poz]; r=x/v; putere+=r;}
	//f2<<k<<" "<<poz<<" "<<x<<" "<<putere<<endl;
	if (putere>=pt[poz]) return 1;
	return 0;
}
int main()
{
	f1>>p>>q;
	long long i,j,step;
	desc();
	for (i=1; i<=nr; i++) pt[i]*=q;
	for (i=1; i<=nr; i++)
	{
		for (step=1; step<=pt[i]; step<<=1);
		for (j=step; step; step>>=1)
		{
			if (j>step && calc(j-step,i)) j-=step;
		}
		b[i]=j*t[i];
	}
	long long sol=b[1];
	for (i=1; i<=nr; i++) if (b[i]>sol) sol=b[i];
	f2<<sol;
	return 0;
}