Cod sursa(job #327614)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 29 iunie 2009 16:22:47
Problema GFact Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<cstdio>

const long long N=(long long)1<<60;

int p,nr;
//struct putere{int val,p;}v[10000];
int *a[100];
int citire()
{
	freopen("gfact.in","r",stdin);
	freopen("gfact.out","w",stdout);
	int n;
	scanf("%d%d",&n,&p);
	return n;
}
void desc(int n)
{
	for (int i=2; i*i<=n; ++i)
	{
		int putere=0;
		while (n%i==0)
		{
			n/=i;
			++putere;
		}
		a[++nr]=new int [2];
		a[nr][0]=i;
		a[nr][1]=putere*p;
		/*v[++nr].val=i;
		v[nr].p=putere*p;*/
	}
	if (n!=1)
	{
		a[++nr]=new int [2];
		a[nr][0]=n;
		a[nr][1]=p;
		/*v[++nr].val=n;
		v[nr].p=p;*/
	}
}
bool zero(long long x)
{
	for (int i=1; i<=nr; ++i)
	{
		long long r=0,cx=x;
		while (cx)
		{
			//cx/=v[i].val;
			cx/=a[i][0];
			r+=cx;
		}
		if (r<a[i][1])
			return false;
	}
	return true;
}
long long caut()
{
	long long m,st=1,dr=N;
	while (st!=dr)
	{
		m=(st+dr)>>1;
		if (!zero(m))
			st=m+1;
		else dr=m;
	}
	//if (!zero(st)) return -1;
	return st;
}
int main()
{
	desc(citire());
	printf("%lld",caut());
	return 0;
}