Pagini recente » Cod sursa (job #1500220) | Cod sursa (job #590408) | Cod sursa (job #537361) | Cod sursa (job #277457) | Cod sursa (job #3134688)
//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];
}
int cntMult(int x, int baza)
{
int c=0;
do c+=(x/=baza); while(x);
return c;
}
int binara(int baza, int exp)
{
int 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, max;
fscanf(f, "%d%d", &P, &Q);
factorizare(P);
max=0;
for(auto& pr : mp)
{
P=binara(pr.first, pr.second*Q);
if(P>max)
max=P;
}
fprintf(g, "%d\n", max);
fclose(f);
fclose(g);
return 0;
}