Pagini recente » Cod sursa (job #3192142) | Cod sursa (job #3168753) | Cod sursa (job #2539274) | Cod sursa (job #2866886) | Cod sursa (job #3152921)
#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
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 = 10^7, 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;
}
int main()
{
int p, q, d, sol = 0;
fin >> p >> q;
///
d = 2;
int exp = 0;
while(!(p % d))
{
exp++;
p /= d;
}
exp *= q;
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;
sol = max(sol, cautbin(d, exp));
}
if(p > 1)
sol = max(sol, cautbin(p, 1));
fout << sol;
return 0;
}