Cod sursa(job #354545)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 8 octombrie 2009 18:29:45
Problema GFact Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include<stdio.h>
int b,q,n;
int v[12],p[12];

void read()
{
	freopen("gfact.in","r",stdin);
	freopen("gfact.out","w",stdout);
	scanf("%d%d",&b,&q);
	int i,cb=b;
	for(i=2;i*i<=cb;i++)
		if(b%i==0)
		{
			v[++n]=i;
			while(b%i==0)
			{
				p[n]++;
				b=b/i;
			}
		}
	if(b>1)
	{
		v[++n]=b;
		p[n]=1;
	}
}

int exista(int i, int x)
{
	int y=x;
	while(x)
	{
		y=y+x/v[i];
		x=x/v[i];
	}
	if(y>=p[i]*q)
		return 1;
	return 0;
}

void rez()
{
	int i,st,dr,m,sol,j;
	long long x,min=2000000000*(long long)20000000;
	for(i=1;i<=n;i++)
	{
		st=1;
		dr=p[i]*q;
		while(st<=dr)
		{
			m=(st+dr)>>1;
			if(exista(i,m))
			{
				sol=m;
				dr=m-1;
			}
			else
				st=m+1;
		}
		x=1;
		for(j=1;j<=sol;j++)
			x=x*v[i];
		if(x<min)
			min=x;
	}
	printf("%lld\n",min);
}

int main()
{
	read();
	rez();
	return 0;
}