Pagini recente » Cod sursa (job #1117692) | Cod sursa (job #154018) | Cod sursa (job #3199510) | Cod sursa (job #1113583) | Cod sursa (job #3142880)
#include <fstream>
#include <vector>
#define ll long long
using namespace std;
ifstream cin("frac.in");
ofstream cout("frac.out");
const int VALMAX = 1e6;
ll n;
ll P;
bool c[VALMAX + 1];
vector<ll> prime, factori;
void Eratostene()
{
c[0] = c[1] = 1;
for(int i = 2; i * i <= VALMAX; i++)
if(!c[i])
for(int j = 2; i * j <= VALMAX; j++)
c[i * j] = 1;
for(int i = 2; i <= VALMAX; i++)
if(!c[i])
prime.push_back(i);
}
void Desc(ll n)
{
ll ind = 0, d = prime[ind];
while(n > 1)
{
if(n % d == 0)
{
factori.push_back(d);
while(n % d == 0)
n /= d;
}
d = prime[++ind];
if(d * d > n)
d = n;
}
}
ll Count(ll n)
{
ll ans = 0;
for(int i = 1; i < (1 << factori.size()); i++)
{
int lungime = 0;
ll prod = 1;
for(int j = 0; j < factori.size(); j++)
if((i >> j) & 1)
lungime++, prod *= factori[j];
if(lungime % 2 == 1)
ans += n / prod;
else
ans -= n / prod;
}
return n - ans;
}
int main()
{
Eratostene();
cin >> n >> P;
Desc(n);
ll st = 1, dr = (1LL << 61), ans = 0;
while(st <= dr)
{
ll mij = (st + dr) / 2;
if(Count(mij) >= P)
ans = mij, dr = mij - 1;
else
st = mij + 1;
}
cout << ans;
return 0;
}