Cod sursa(job #469412)

Utilizator elfusFlorin Chirica elfus Data 7 iulie 2010 18:27:57
Problema GFact Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<stdio.h>
#include<math.h>
#define LL long long
#define max(x,y) (x>y) ? x : y
using namespace std;
LL factors[2012],powers[2012];	

void desc(int n)
{
LL d=2,e,limita;
limita=(LL)sqrt(n);
while(d<=limita && n>1)
{
	e=0;
	while((n%d)==0)
	{
		e++;
		n/=d;
	}
	if(e)
		{
			factors[++factors[0]]=d;
			powers[++powers[0]]=e;
	
		}
	d++;
}
if(n>1)
	{
		factors[++factors[0]]=n; 
		powers[++powers[0]]=1;
    }
}

LL multi(LL p,LL n)
{
	LL num=p,s=0;
	while(n)
	{
		s+=n/num;
		n=n/num;
	}
return s;
}

LL cautare(LL fact,LL exp)
{
	LL pozdy=0,elfus,med,st=1,dr=(1ll<<61)-1;
	while(st<=dr)
	{
		med=(st+dr)>>1;
		elfus=multi(fact,med);
		if(elfus>=exp)
		{
			dr=med-1;
			pozdy=med;
		}
		else
			st=med+1;
	}
	return pozdy;
}

int main()
{
	LL p,q,sol=-1,i;
	
	freopen("gfact.in","r",stdin);
	freopen("gfact.out","w",stdout);
	
	scanf("%I64d%I64d",&p,&q);
	desc(p); //factors vs powers
	
	for(i=1;i<=powers[0];i++)
		powers[i]*=q;
	
	for(i=1;i<=powers[0];i++)
		sol=max(sol,cautare(factors[i],powers[i]));
	printf("%lld",sol);
	return 0;
}