Pagini recente » Cod sursa (job #2337272) | Cod sursa (job #1598973) | Cod sursa (job #2746323) | Cod sursa (job #1415641) | Cod sursa (job #249010)
Cod sursa(job #249010)
#include <stdio.h>
#define N 100000005
long long p,q;
void citire()
{
scanf("%lld%lld",&p,&q);
}
bool prim(int n)
{
int i;
if (n<2)
return false;
if (n==2)
return true;
if (n%2==0)
return false;
for (i=3; i*i<=n; i+=2)
if (n%i==0)
return false;
return true;
}
int fact(int p,int q)
{
int s=0,i,t;
for (i=q; i<=p; i+=q)
if (i%q==0)
{
t=i;
while(t%q==0)
{
t/=q;
s++;
}
}
return s;
}
int calcul(int r,int k)
{
int st=1,dr=r*k,m;
while (st!=dr)
{
m=(st+dr)/2;
if (fact(m,k)==r)
return m/k*k;
else
if (fact(m,k)<r)
st=m+1;
else
dr=m;
}
return 0;
}
void desc()
{
int i,putere;
long long nr=0,max=0;
if (prim(p) && q==1)
printf("%lld",p);
else
{
for (i=2; i*i<=p ;i++)
if (p%i==0)
{
putere=0;
while (p%i==0)
{
p/=i;
putere++;
}
nr=calcul(putere*q,i);
if (nr>max)
max=nr;
}
if (p!=1)
{
nr=calcul(1*q,p);
if (nr>max)
max=nr;
}
printf("%lld",max);
}
}
int main()
{
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
citire();
desc();
return 0;
}