Cod sursa(job #469355)

Utilizator SmarandaMaria Pandele Smaranda Data 7 iulie 2010 17:21:51
Problema GFact Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<stdio.h>
#include<math.h>
long f[40001];
long p[40001];
long multi (long b,long i)
{
	long numitor,m=0;
	numitor=f[i];
	while (b/numitor)
	{
		m+=b/numitor;
		numitor=numitor*f[i];
	}
	return m;
}

long cautbin(long st , long dr , long i)
{
	long m,poz;
	while (st<=dr)
	{
		m=(st+dr)/2;
		if (multi(m,i)>=p[i])
			{
				dr=m-1;
				poz=m;
			}
		else
			st=m+1;
	}
	return poz;
}

int main()
{
	long pu,q,b,d,lim,e,u=0,max,i;
	
	freopen("gfact.in","r",stdin);
	freopen("gfact.out","w",stdout);
	
	scanf("%ld%ld",&pu,&q);
	d=2;
	e=0;
		while (pu%d==0)
		{
			pu=pu/d;
			e++;
		}
		if (e)
		{
			f[++u]=d;
			p[u]=e*q;
		}
	d++;
	lim=sqrt(pu);
	while (d<=lim && pu>1)
	{
		e=0;
		while (pu%d==0)
		{
			pu=pu/d;
			e++;
		}
		if (e)
		{
			f[++u]=d;
			p[u]=e*q;
		}
		d=d+2;
	}
	if (pu>1)
	{
		f[++u]=pu;
		p[u]=q;
	}
	max=-1;
	for (i=1;i<=u;i++)
	{
		b=cautbin(1,((1<<31)-1),i);	
		if (b>max)
			max=b;
	}
	b=max;
	printf("%ld\n",b);
	return 0;
}