Cod sursa(job #327624)

Utilizator RegeleUmbrelorPopescu Mihai RegeleUmbrelor Data 29 iunie 2009 16:53:39
Problema GFact Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
using namespace std;
#include<stdio.h>
const int P=1<<31-1;
int fact[20][2], nrp=0,p,q;

void des(int n)
{
	int i,j;
	for(i=2,j=1;i*i<=n;++i)
	{
		while(!(n%i))
		{	
			n=n/i;
			fact[j][1]++;
		}
		if(fact[j][1])
			fact[j++][0]=i;
	}
	if(n!=1)
	{	
		fact[j][0]=n;
		fact[j++][1]=1;
	}
	nrp=j-1;
	//printf("am desc\n");
}

bool zero( int f)
{
	int s=0,x=f, min=1000000000,i;
	/*
	while(x)
	{	
		x=x/fact[1][0];
		s+=x;
	}	
	min=s/fact[1][1];
	*/
	for(i=1;i<=nrp;++i)
	{
		x=f;s=0;
		while(x)
		{
			x=x/fact[i][0];
			s+=x;
		}
		//printf("n=%d fact=%d, s=%d\n",f,fact[i][0],s);
		if(s<q*fact[i][1])
			return false;
	}
	return true;
}

long long caut()
{
	int st=1,dr=P;
	long long m;
	while(st!=dr)
	{	
		m=(st+dr)/2;
		//printf("zero(%d)=%d\n",m,zero(m));
		if(!zero(m))
			st=m+1;
		else
			dr=m;
		//printf("%d\n",m);
	}
	return st;
}

int main()
{
	freopen("gfact.in","r", stdin);
	scanf("%d%d", &p,&q);
	des(p);
	//printf("nrp=%d, p=%d ^%d\n",nrp,fact[1][0],fact[1][1]);
	freopen("gfact.out","w", stdout);
	printf("%d", caut());
	return 0;
}