Pagini recente » Cod sursa (job #2000942) | Istoria paginii runda/abc/clasament | Cod sursa (job #1882064) | Istoria paginii runda/oji-10-2 | Cod sursa (job #578775)
Cod sursa(job #578775)
#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;
ofstream g("gfact.out");
for (LL i = st; i < dr; ++ i)
if (valid (i))
{
g << i;
return;
}
}
int main()
{
ifstream f("gfact.in");
f >> P >> Q;
ciur ();
getPrimes_factor (P);
for (unsigned int i = 0; i < v.size(); ++ i)
exxp[i] *= Q;
bin_Search ();
//g << sol;
return 0;
}