Pagini recente » Cod sursa (job #2666700) | Cod sursa (job #2909960) | Cod sursa (job #912337) | Cod sursa (job #1949065) | Cod sursa (job #480392)
Cod sursa(job #480392)
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<cmath>
#include<vector>
using namespace std;
typedef std::vector<std::pair<long long int, long long int> > divisor;
long long int P,Q;
divisor* D;
long long int R;
divisor* get_divisor(long long int P, long long int Q) {
divisor* result = new divisor;
long long int i = 2;
while(P != 1) {
if(P % i == 0) {
long long int k = 0;
while(P % i == 0) {
k++;
P /= i;
}
std::pair<long long int, long long int> apair;
apair.first = i;
apair.second = k * Q;
result->push_back(apair);
}
if(i > sqrt(P)) {
if(P == 1)
break;
std::pair<long long int, long long int> apair;
apair.first = P;
apair.second = Q;
result->push_back(apair);
break;
}
if(i != 2)
i += 2;
else
i++;
}
return result;
}
int get_apear(long long int N, long long int p) {
long long int i = 0;
while(N > 0) {
i += N / p;
N /= p;
}
return i;
}
int get_nr(long long int N) {
for(std::vector<std::pair<long long int, long long int> >::iterator it = D->begin(); it != D->end(); it++) {
std::pair<long long int, long long int> apair = *it;
int count = get_apear(N, it->first);
if(count < it->second) {
return 1;
}
}
return 0;
}
long long int final_result(long long int mijloc) {
if(get_nr(mijloc) != 0) {
mijloc++;
while(get_nr(mijloc) != 0) {
mijloc++;
}
return mijloc;
}
while(get_nr(mijloc) == 0) {
mijloc--;
}
return mijloc + 1;
}
void b_search(long long int left, long long int right) {
long long int mijloc = 2;
while(left < right) {
mijloc = (left + right) / 2;
long long int result = get_nr(mijloc);
if(result > 0) {
left = mijloc + 1;
}
else {
right = mijloc;
}
}
R = final_result(mijloc);
}
void solve() {
D = get_divisor(P, Q);
b_search(1, P * Q);
}
int main() {
ifstream in("gfact.in");
ofstream out("gfact.out");
in >> P >> Q;
solve();
out << R;
in.close();
out.close();
}