Pagini recente » Cod sursa (job #2221233) | Cod sursa (job #587531) | Cod sursa (job #286799) | Cod sursa (job #587515) | Cod sursa (job #1897751)
#include <fstream>
using namespace std;
typedef long long int lint;
int sz;
int primes[20];
lint doCount(lint bound) {
lint ans = 0;
for (int i = 0; i < (1 << sz); ++ i) {
lint prod = 1;
int sign = 1;
for (int j = 0; j < sz; ++ j)
if (i & (1 << j))
prod *= primes[j], sign *= (-1);
ans += sign * (bound / prod);
}
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;
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;
}