Pagini recente » Cod sursa (job #533245) | Cod sursa (job #1912724) | Cod sursa (job #2008905) | Cod sursa (job #59602) | Cod sursa (job #169236)
Cod sursa(job #169236)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<long long, long long> pii;
int P, Q;
vector<pii> T;
long long putere(long long x, long long t) {
long long r(0);
long long aux = t;
while (aux <= x) {
r += x / aux;
aux *= t;
}
return r;
}
int main(int argc, char *argv[]) {
ifstream fin("gfact.in");
fin >> P >> Q;
fin.close();
int aux = P;
int t(0);
while (aux % 2 == 0) {
++t;
aux /= 2;
}
if (t)
T.push_back(make_pair(2, t));
int i = 3;
while (i <= aux) {
t = 0;
while (aux % i == 0) {
++t;
aux /= i;
}
if (t)
T.push_back(make_pair(i, t));
i += 2;
}
long long m = -1;
for (vector<pii>::iterator it = T.begin(); it != T.end(); ++it) {
long long t = it->first;
long long f = it->second * Q;
//cout << t << " " << f << endl;
/*int p = 1;
int r = f;
while (p != r) {
//cout << p << " " << r << endl;
int q = (p + r) / 2;
if (putere(q * t, t) < f)
p = q + 1;
else
r = q;
}
//cout << p*t << endl;
if (m < p*t)
m = p*t;*/
long long i, step;
for (step = 1; step <= f; step <<= 1)
;
for (i = 1; step; step >>= 1)
if ((i + step <= f) && (putere((i + step) * t, t) <= f))
i += step;
//cout << i*t << endl;
if (m < i*t)
m = i*t;
}
ofstream fout("gfact.out");
fout << m << endl;
fout.close();
return 0;
}