Cod sursa(job #353471)

Utilizator pirvupirvu tudor pirvu Data 5 octombrie 2009 12:19:06
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<cstdio>

long long v[1000];

long long c[1000];

long long n2;

void descompunere(long long p)
{
	if (p%2==0) v[++v[0]]=2;
	while (p%2==0)
	{ 
		c[v[0]]++; 
		p/=2;
	}
	for (long long i=3;i*i<=p;i+=2)
	{
		if (p%i==0) 
			v[++v[0]]=i;
		while (p%i==0)  
		{ 
			c[v[0]]++; 
			p/=i;
		}
	}
	
	if (p>1)
	{
		v[++v[0]]=p;
		c[v[0]]=1;
	}
	c[0]=v[0];
}




bool nrz( long long n, long long a, long long b)//verific daca a (prim) apare la o putere >=b in desc lui n!
{
	long long b2=0;
	while(n)
		b2 += (n/=a);
	return b2>=b;
}

bool div( long long n)
{
	for (long long i=1;i<=v[0];i++)
		if (!nrz(n,v[i],c[i]) ) return 0;
	return 1;
}


long long caut()
{
	long long i,pas=(long long)1<<60;
	for (i=0;pas;pas>>=1)
		if (!div(i+pas) ) i+=pas;
	return i+1;
}



int main()
{
	
	freopen("gfact.in","r",stdin);
	freopen("gfact.out","w",stdout);
	long long p,q;
	scanf("%lld%lld", &p , &q);

	descompunere(p);
	
	for (long long i=1;i<=v[0];i++)
		c[i]*=q;
	
	n2=p;
	
	long long c2=caut();
	
	printf("%lld", c2);
	
	
	return 0;
}