Pagini recente » Cod sursa (job #2310202) | Cod sursa (job #2419179) | Cod sursa (job #925621) | Cod sursa (job #3238556) | Cod sursa (job #635231)
Cod sursa(job #635231)
#include <stdio.h>
#define PMAX 100
long long div[PMAX];
long long prod, n, p, result;
int nr, nd;
void back(int k, long long m)
{
int i;
for (i = 0; i <= 1; ++i) {
if (i == 1) {
prod *= div[k];
++nr;
}
if (k == nd) {
if (nr % 2 == 1)
result -= m/prod;
else
result += m/prod;
}
else
back(k + 1, m);
if (i == 1) {
prod /= div[k];
--nr;
}
}
}
long long try(long long m)
{
result = 0;
prod = 1;
nr = 0;
back(1, m);
return result;
}
long long binary_search(long long low, long long high)
{
long long res;
long long mid;
long long pos = high + 1;
while (low <= high) {
mid = (low + high)/2;
res = try(mid);
if (res >= p) {
high = mid - 1;
pos = mid;
}
else
low = mid + 1;
}
return pos;
}
int main()
{
freopen("frac.in", "r", stdin);
freopen("frac.out", "w", stdout);
scanf("%lld %lld", &n, &p);
long long aux = n;
long long i;
for (i = 2; i * i <= aux; ++i)
if (n % i == 0) {
div[++nd] = i;
while (n % i == 0)
n /= i;
}
if (n > 1)
div[++nd] = n;
long long h = (long long) 1 << 61;
long long result = binary_search(1, h);
printf("%lld\n", result);
return 0;
}