Cod sursa(job #508290)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 7 decembrie 2010 23:07:49
Problema GFact Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <iostream>
#include <fstream>
#include <math.h>

using namespace std;

const char iname[] = "gfact.in";
const char oname[] = "gfact.out";

ifstream fin(iname);
ofstream fout(oname);

long long p,q,fc,d,ct[55000],st,dr,mj,rez,factor[55000],nr[55000],mx;
long long k,i;

int calc(int vl,int k)
{	
	int mult,x,nom=0,sm=0;
	mult=factor[k];
	x=vl;
	if(factor[k]>0)
		while(x>=mult)
			{
				nom=x/mult;
				mult*=factor[k];
				sm+=nom;
			}
	return sm;
}

		
int main()
{
	fin>>p>>q;
	fc=p,d=2;
	//factorizam p si numar
	int ct2=0;
	while(fc>1 && ct2==0)
	{	
		
		if(fc%d==0)
		{
			if(d>sqrt(p))
				ct2++;
			fc=fc/d;
			if(ct[d]==0)
				factor[++k]=d;
			ct[d]++;
		}
		else
			d++;
	}
	
	
	
	for(i=1;i<=k;i++)
	{	
		st=1; 
		dr=q*ct[factor[i]]+1;
		mj=0,rez=0;
		while(st<dr)
		{
			mj=(st+dr)/2;
			rez=calc(mj*factor[i],i);
			if(rez>ct[factor[i]]*q)
				dr=mj;
			else
				if(rez<ct[factor[i]]*q)
				st=mj+1;
			else
				break;
		}
		nr[i]=mj*factor[i];
	}
		
	for(i=1;i<=k;i++)
		if(nr[i]>mx)
			mx=nr[i];
	fout<<mx<<"\n";
	return 0;
}