Pagini recente » Cod sursa (job #2694631) | Monitorul de evaluare | Cod sursa (job #1910370) | Cod sursa (job #1218154) | Cod sursa (job #3347505)
#include <fstream>
#include <vector>
using namespace std;
typedef long long ll;
ifstream fin("frac.in");
ofstream fout("frac.out");
ll n, p, phi;
vector<ll> f;
void get_f(ll x) {
ll d = 2;
ll temp = x;
phi = x;
while (d * d <= temp) {
if (temp % d == 0) {
f.push_back(d);
phi = phi / d * (d - 1);
while (temp % d == 0) temp /= d;
}
d++;
}
if (temp > 1) {
f.push_back(temp);
phi = phi / temp * (temp - 1);
}
}
ll count_rel(ll m) {
ll cnt = 0;
int sz = f.size();
for (int i = 1; i < (1 << sz); ++i) {
ll prod = 1;
int bits = 0;
for (int j = 0; j < sz; ++j) {
if ((i >> j) & 1) {
prod *= f[j];
bits++;
}
}
if (bits % 2 == 1) cnt += m / prod;
else cnt -= m / prod;
}
return m - cnt;
}
int main() {
fin >> n >> p;
if (n == 1) {
fout << p << "\n";
return 0;
}
get_f(n);
ll cycles = (p - 1) / phi;
p = (p - 1) % phi + 1;
ll st = 1, dr = n, ans = 0;
while (st <= dr) {
ll mid = st + (dr - st) / 2;
if (count_rel(mid) >= p) {
ans = mid;
dr = mid - 1;
} else {
st = mid + 1;
}
}
fout << cycles * n + ans << "\n";
return 0;
}