Cod sursa(job #2795601)
Utilizator | Data | 6 noiembrie 2021 17:47:58 | |
---|---|---|---|
Problema | GFact | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 1.66 kb |
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream fin("gfact.in");
ofstream fout("gfact.out");
unsigned long long P, Q, k, b=0, r, st, dr, nr, prim, m;
fin >> P >> Q;
for (int i = 2; i * i <= P; i++)
{
r = 0;
while (P % i == 0)
{
r++;
P /= i;
}
if (r != 0)
{
r*=Q;
dr = 1; st = 2 * r * i;
while (dr <= st)
{
m = (dr + st) / 2;
nr = 0;
prim = i;
while (m / prim>0)
{
nr += (m / prim);
prim *= i;
}
if (nr == r)
{
while (m % i) m--;
break;
}
else if (nr > r)
st = m - 1;
else
dr = m + 1;
}
if (m > b)
b = m;
}
}
if (P >= 2)
{
k = P; r = Q;
dr = 1;
st = 2 * r * k;
while (dr <= st)
{
m = (dr + st) / 2;
nr = 0;
prim = k;
while (m / prim)
{
nr += (m / prim);
prim *= k;
}
if (nr == r)
{
while (m % k != 0) m--;
break;
}
else if (nr > r)
st = m - 1;
else dr = m + 1;
}
if (m > b)
b = m;
}
fout << b << '\n';
}