Pagini recente » Cod sursa (job #1147124) | Monitorul de evaluare | Cod sursa (job #1275952) | Cod sursa (job #1022692) | Cod sursa (job #3340213)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("frac.in");
ofstream g ("frac.out");
long long calc(long long a, long long b){
vector<int> prime;
long long ans = 0;
int d = 2, p = 1;
while(b > 1)
{
p = 0;
while(b && b % d == 0)
{
b /= d;
p++;
}
if(p)
prime.push_back(d);
d++;
if(d *d > b && b > 1)
d = b;
}
int s = prime.size();
for(int mask = 1; mask < (1 << s); mask++){
long long sm = 1;
for(int i = 0; i < s; i++)
{
if(mask & (1 << i))
sm = 1ULL * sm * prime[i];
}
if(sm <= a)
{
if(__builtin_popcount(mask) % 2 == 0)
ans -= (a / sm);
else
ans += (a / sm);
}
}
return a - ans;
}
long long n, p;
int main(){
f >> n >> p;
long long st = 1, dr = 1e18;
while(st <= dr)
{
long long tm = (st + dr) / 2;
long long nr = calc(tm, n);
if(nr < p)
st = tm + 1;
else
dr = tm - 1;
}
g << st << " " << '\n';
}