Pagini recente » Cod sursa (job #656080) | Cod sursa (job #1261620) | Cod sursa (job #460354) | Cod sursa (job #2784260) | Cod sursa (job #515310)
Cod sursa(job #515310)
#include<fstream>
#include<cmath>
#include<cassert>
using namespace std;
long long n, p;
int nd, nr, s[50];
long long divz[50], result, prod;
ofstream g("frac.out");
void back(int k, long long m) {
for (int i = 0; i <= 1; i++) {
s[k] = i;
if (i == 1) {
nr++;
prod *= divz[k];
}
if (k == nd) {
if (nr % 2 == 1)
result -= m/prod;
else
result += m/prod;
}
else
back(k+1, m);
if (i == 1) {
nr--;
prod /= divz[k];
}
}
}
long long trym(long long m) {
result = 0;
prod = 1;
nr = 0;
back(1, m);
return result;
}
long long bsearch(long long pr, long long u) {
long long m, x = u+1;
while (pr <= u) {
m = (pr+u)/2;
long long t;
t = trym(m);
if (t >= p) {
u = m-1;
x = m;
}
else
pr = m+1;
}
return x;
}
int main() {
ifstream f("frac.in");
f >> n >> p;
assert(n > 1);
long long nn = n;
long long i;
for (i = 2; i*i <= nn; i++)
if (n%i == 0) {
nd++;
divz[nd] = i;
while (n%i == 0)
n = n/i;
}
if (n > 1) {
nd++;
divz[nd] = n;
}
long long x = (long long) 1 << 61;
long long result = bsearch(1, x);
g << result << '\n';
return 0;
}