Pagini recente » Cod sursa (job #1067293) | Cod sursa (job #2987292) | Cod sursa (job #562538) | Cod sursa (job #3134015) | Cod sursa (job #3134690)
//Ilie Dumitru
#include<cstdio>
#include<map>
std::map<int, int> mp;
void factorizare(int x)
{
int i;
while(!(x&1))
{
++mp[2];
x>>=1;
}
for(i=3;i*i<=x;i+=2)
while(x%i==0)
{
x/=i;
++mp[i];
}
if(x>1)
++mp[x];
}
long long cntMult(long long x, long long baza)
{
long long c=0;
do c+=(x/=baza); while(x);
return c;
}
long long binara(int baza, long long exp)
{
long long l=0, r=baza*exp, mid;
do
{
mid=l+((r-l)>>1);
if(cntMult(mid, baza)<exp)
l=mid;
else
r=mid;
}while(r-l>1);
return r;
}
int main()
{
FILE* f=fopen("gfact.in", "r"), *g=fopen("gfact.out", "w");
//FILE* f=stdin, *g=stdout;
int P, Q;
long long x, max;
fscanf(f, "%d%d", &P, &Q);
factorizare(P);
max=0;
for(auto& pr : mp)
{
x=binara(pr.first, pr.second*(long long)Q);
if(x>max)
max=x;
}
fprintf(g, "%lld\n", max);
fclose(f);
fclose(g);
return 0;
}