Cod sursa(job #571123)

Utilizator borsoszalanBorsos Zalan borsoszalan Data 4 aprilie 2011 08:24:02
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include<stdio.h>
#include<math.h>
#define LL long long
long long min=0;
long long q;

long long mult(long long a,long long b)
{
	long long num=b,s=0;	
	while(a/num)
	{
		s+=a/num;
		num*=b;
	}
	return s;
}

long long bin(long long d,long long e)
{
	long long m,pozdy=0,st,dr;	
	st=1;
	dr= (1ll<<61)-1;
	while(st<=dr)
		{
			m=(st+dr)>>1;
			if(mult(m,d)>=e)
				{
					dr=m-1;
					pozdy=m;
				}
			else
				st=m+1;
		}
	return pozdy;
}
void desc(long long p)
{ 
	long long d=2,e,f,a;	
    e=sqrt(p);
	while(d<=e&&p>1)
	{
		f=0;
		while(p%d==0)
		{
			f++;
			p=p/d;
		}
		if(f)	
		{
			a=bin(d,f*q);
			if(a>min)
				min=a;
		}
		d++;
	}
	if(p>1)
	{
		a=bin(p,q);
		if(a>min)
			min=a;
	}
}
int main()
{
	freopen("gfact.in","r",stdin);
	freopen("gfact.out","w",stdout);
	long long p;
	scanf("%lld%lld",&p,&q);
	desc(p);
	printf("%lld\n",min);
	return 0;
}