Pagini recente » Cod sursa (job #690854) | Cod sursa (job #910715) | Cod sursa (job #2607620) | Cod sursa (job #990177) | Cod sursa (job #1897758)
#include <fstream>
using namespace std;
typedef long long int lint;
int sz;
int primes[10];
lint prod[1 << 10];
int sign[1 << 10];
void prec() {
for (int i = 0; i < (1 << sz); ++ i) {
prod[i] = sign[i] = 1;
for (int j = 0; j < sz; ++ j)
if (i & (1 << j))
prod[i] *= primes[j], sign[i] *= (-1);
}
}
lint doCount(lint bound) {
lint ans = 0;
for (int i = 0; i < (1 << sz); ++ i)
ans += sign[i] * (bound / prod[i]);
return ans;
}
int main()
{
ifstream cin("frac.in");
ofstream cout("frac.out");
lint N, P;
cin >> N >> P;
lint _N = N;
for (int i = 2; 1LL * i * i <= _N; ++ i)
if (_N % i == 0) {
primes[sz ++] = i;
while (_N % i == 0)
_N /= i;
}
if (_N > 1)
primes[sz ++] = _N;
prec();
lint st = 1;
lint dr = (1LL << 61);
lint ans = dr + 1;
while (st <= dr) {
lint mid = (st + dr) >> 1;
if (doCount(mid) >= P) {
ans = mid;
dr = mid - 1;
}
else
st = mid + 1;
}
cout << ans << '\n';
return 0;
}