Pagini recente » Cod sursa (job #2891106) | Cod sursa (job #1081079) | Cod sursa (job #1528689) | Cod sursa (job #1063569) | Cod sursa (job #3233487)
#include <fstream>
using namespace std;
const int VMIN = 0;
const long long VMAX = 1LL << 50;
const int NDP = 9;
int d[NDP], p[NDP], ndp, a, q;
void descompunere()
{
int div = 2;
while (div * div <= a)
{
if (a % div == 0)
{
d[ndp] = div;
p[ndp] = 0;
while (a % div == 0)
{
p[ndp]++;
a /= div;
}
p[ndp] *= q;
ndp++;
}
div++;
}
if (a != 1)
{
d[ndp] = a;
p[ndp++] = q;
}
}
long long putere(int d, long long n)
{
long long p = 0;
while (n >= d)
{
p += n / d;
n /= d;
}
return p;
}
bool este_div(long long n)
{
for (int i = 0; i < ndp; i++)
{
if (putere(d[i], n) < p[i])///n! nu e divizibil cu d[i] la p[i]
{
return false;
}
}
return true;
}
int main()
{
ifstream in("gfact.in");
ofstream out("gfact.out");
in >> a >> q;
descompunere();
long long st = VMIN, dr = VMAX, rez = VMAX + 1;
while (st <= dr)
{
long long m = (st + dr) / 2;
if (este_div(m))
{
rez = m;
dr = m - 1;
}
else
{
st = m + 1;
}
}
out << rez << "\n";
in.close();
out.close();
return 0;
}