Pagini recente » Cod sursa (job #1444510) | Cod sursa (job #1051104) | Cod sursa (job #2116224) | Cod sursa (job #94962) | Cod sursa (job #614983)
Cod sursa(job #614983)
#include<fstream>
#include<vector>
#include<cmath>
#include<iostream>
using namespace std;
vector < pair <int,int> > divx;
ofstream g("gfact.out");
void calculateDiv(long long p, int q) {
int sqr = sqrt(p), nr;
for (int i = 2; i <= sqr && p > 1; i++) {
nr = 0;
while (p % i == 0) {
nr++;
p = p/i;
}
if (nr > 0) {
divx.push_back(make_pair(i, nr*q));
}
}
if (divx.size() == 0) {
divx.push_back(make_pair(p, q));
}
}
int testSolution(long long x) {
int cod = 1;
long long aux, d, p, paux;
for (int i = 0; i < divx.size(); i++) {
d = divx[i].first;
p = divx[i].second;
aux = x;
paux = 0;
while (aux > 0 && paux < p) {
paux += aux/d;
aux = aux/d;
}
if (paux < p) {
cod = 0;
break;
}
}
return cod;
}
long long bsearch(long long left, long long right) {
long long m, result;
while (left <= right) {
m = (left+right)/2;
if (testSolution(m)) {
result = m;
right = m-1;
} else {
left = m+1;
}
}
return result;
}
int main() {
ifstream f("gfact.in");
int p, q;
f >> p >> q;
long long r = (long long) p * q;
calculateDiv(p, q);
long long result = bsearch(1, r);
g << result << '\n';
return 0;
}