Pagini recente » Cod sursa (job #2664878) | Cod sursa (job #2627255) | Cod sursa (job #3295193) | Cod sursa (job #2195211) | Cod sursa (job #2767548)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("frac.in");
ofstream fout("frac.out");
long long n, p;
int main(){
fin >> n >> p;
long long st = p, dr = (1LL << 61), ans = 0;
vector <long long> div;
for (long long i = 2; i * i <= n; ++i){
bool ok = false;
while (n % i == 0){
n = n / i;
ok = true;
}
if (ok){
div.push_back(i);
}
}
if (n > 1){
div.push_back(n);
}
while (st <= dr){
long long mid = (1LL * st + dr) / 2;
long long cnt = mid;
for (int stare = 1; stare < (1LL << div.size()); ++stare){
int b = 0;
long long val = 1;
for (int j = 0; j < div.size(); ++j){
if ((stare >> j) & 1){
val = 1LL * val * div[j];
++b;
}
}
if (b % 2 == 1){
cnt = cnt - mid / val;
}
else{
cnt = cnt + mid / val;
}
}
if (cnt >= p){
ans = mid;
dr = mid - 1;
}
else{
st = mid + 1;
}
}
fout << ans;
fin.close();
fout.close();
return 0;
}