Pagini recente » Cod sursa (job #1113933) | Cod sursa (job #2330604) | Cod sursa (job #2832485) | Cod sursa (job #1280037) | Cod sursa (job #3152928)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("gfact.in");
ofstream fout("gfact.out");
///P^Q are maxim ~ 270.000 de cifre. Putem deci, cauta binar pana la 10^7, aproximand grosolan dupa numarul de zerouri de la final
///radical din P(maxim 2 * 10^9) ~ 44.725, care inmulti cu log2(10^7) implica ~ 10^6 operatii, care intra intr-o zecime de secunda
#define int long long
bool ver(int fact, int d, int exp)
{
int f = d, ans = 0;
while(f <= fact)
{
ans += fact / f;
f *= d;
}
return (ans >= exp);
}
int cautbin(int d, int exp)
{
int st = 1, dr = 1e10, sol = 1;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(ver(mij, d, exp))
{
sol = mij;///este cea mai buna solutie pana in momentul respectiv
dr = mij - 1;
}
else
st = mij + 1;
}
return sol;
}
signed main()
{
int p, q, d, sol = 0;
fin >> p >> q;
///
d = 2;
int exp = 0;
while(!(p % d))
{
exp++;
p /= d;
}
exp *= q;
if(exp)
sol = max(sol, cautbin(d, exp));
///
for(d = 3; d * d <= p; d += 2)
{
int exp = 0;
while(!(p % d))
{
exp++;
p /= d;
}
exp *= q;
if(exp)
sol = max(sol, cautbin(d, exp));
}
if(p > 1)
sol = max(sol, cautbin(p, q));
fout << sol;
return 0;
}