Pagini recente » Cod sursa (job #2396177) | Cod sursa (job #2287087) | Cod sursa (job #1191027) | Cod sursa (job #3279028) | Cod sursa (job #3215951)
#include <fstream>
#include <vector>
using namespace std;
const long long VMAX = 1e14;
void descompun(vector < pair <int, int>> &v, int n)
{
int d = 2;
while (d * d <= n)
{
if (n % d == 0)
{
int p = 0;
while (n % d == 0)
{
p++;
n /= d;
}
v.push_back({d, p});
}
d++;
}
if (n != 1)
{
v.push_back({n, 1});
}
}
long long putere_fact(long long n, int dp)
{
///returneaza puterea la care apare dp (prim) in desc. lui n!
long long p = 0;
while (n >= dp)
{
p += (n /= dp);
}
return p;
}
bool este_div(long long n, vector < pair <int, int>> &dp, int q)
{
///verifica daca n! este divizibil cu produsul asoc. lui dp la puterea q
for (auto div_prim: dp)
{
if (putere_fact(n, div_prim.first) < (long long)q * div_prim.second)
{
return false;
}
}
return true;
}
int caut_bin(int p, int q)
{
vector < pair <int, int>> d;
descompun(d, p);
long long st = 0, dr = VMAX, rez = dr + 1;
while (st <= dr)
{
long long m = (st + dr) / 2;
if (este_div(m, d, q))
{
rez = m;
dr = m - 1;
}
else
{
st = m + 1;
}
}
return rez;
}
int main()
{
ifstream in("gfact.in");
ofstream out("gfact.out");
int p, q;
in >> p >> q;
out << caut_bin(p, q) << "\n";
in.close();
out.close();
return 0;
}