Pagini recente » Cod sursa (job #1883160) | Cod sursa (job #1117277) | Cod sursa (job #1630178) | Cod sursa (job #2078971) | Cod sursa (job #578763)
Cod sursa(job #578763)
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
#define maxRAD 44800
#define PB push_back
#define LL long long
#define maxD 60000000000002LL
vector <int> v, primes;
bool cont[maxRAD];
int P, Q;
LL exxp[maxRAD];
LL a[maxRAD];
LL sol = maxD;
void ciur ()
{
cont[1] = true;
int rad = (int) sqrt ( (double) P );
primes.PB (2);
for (int i = 3; i <= rad; i += 2)
{
if (cont[i]) continue;
primes.PB (i);
for (int j = i + i; j <= rad; j += i)
cont[j] = true;
}
}
void getPrimes_factor (int Q)
{
int rad = (int) sqrt ( (double) Q );
for (unsigned int i = 0; i < primes.size(); ++ i)
{
if (primes[i] > rad) break;
if (Q == 1) break;
if (Q % primes[i]) continue;
v.PB (primes[i]);
while ( ! (Q % primes[i]) )
{
++ exxp[v.size() - 1];
Q /= primes[i];
}
}
if (Q != 1)
{
v.PB (Q);
exxp[v.size() - 1] = 1;
}
}
int valid (LL Q)
{
memset (a, 0, sizeof (a));
for (unsigned int i = 0; i < v.size(); ++ i)
{
LL c = Q;
while (c != 0)
{
c /= primes[i];
a[i] += c;
}
}
for (unsigned int i = 0; i < v.size(); ++ i)
if (a[i] < exxp[i]) return 0;
return 1;
}
void bin_Search ()
{
LL st = 1, dr = maxD, mid;
while (st <= dr)
{
mid = (st + dr) / 2;
if (valid (mid))
{
sol = min (sol, mid);
dr = mid - 1;
}
else
st = mid + 1;
}
}
int main()
{
ifstream f("gfact.in");
ofstream g("gfact.out");
f >> P >> Q;
ciur ();
getPrimes_factor (P);
for (unsigned int i = 0; i < v.size(); ++ i)
exxp[i] *= Q;
bin_Search ();
g << sol;
f.close();
g.close();
return 0;
}