Pagini recente » Cod sursa (job #2845425) | Cod sursa (job #2461347) | Cod sursa (job #1400434) | Cod sursa (job #630242) | Cod sursa (job #2093522)
#include <iostream>
#include <fstream>
#define ll long long
using namespace std;
ifstream fin("gfact.in");
ofstream fout("gfact.out");
ll n, i, j, nr, p, q, d, dv[4700], nd, pt, st, dr, mid, B;
bool ciur[45000];
ll fact (ll p, ll f)
{
ll po=p, rez=0;
while (po <= f)
{
rez += f/po;
po *= p;
}
return rez;
}
int main () {
for (i = 2; i <= 45000; i++)
if (ciur[i] == 0)
{
nd++; dv[nd] = i;
for (j = 2; i*j <= 45000; j++) ciur[i*j]=1;
}
fin >> p >> q;
d = 1;
while (p != 1 && d <= nd)
{
pt = 0;
while (p%dv[d] == 0)
{
pt++;
p /= dv[d];
}
if (pt != 0)
{
st = 1; dr = pt*q;
while (st <= dr)
{
mid = st+(dr-st)/2;
nr = fact(dv[d], mid*dv[d]);
if (nr >= pt*q) dr = mid-1;
if (nr < pt*q) nr = mid+1;
if (nr == pt*q) st = dr+1;
}
if (fact(dv[d], (mid-1)*dv[d]) == pt*q) mid--;
if (fact(dv[d], mid*dv[d]) < pt*q) mid++;
if (mid*dv[d] > B) B = mid*dv[d];
}
d++;
}
if (p > 1)
{
st = 1; dr = q;
while (st <= dr)
{
mid = st+(dr-st)/2;
nr = fact(dv[d], mid*dv[d]);
if (nr >= q) dr = mid-1;
if (nr < q) st = mid+1;
if (nr == q) st = dr+1;
}
if (fact(p, (mid-1)*dv[d]) == q) mid--;
if (fact(p, (mid-1)*dv[d]) < p) mid++;
if (mid*dv[d] > B) B = mid*dv[d];
}
fout << B << "\n";
}