Pagini recente » Cod sursa (job #43107) | Cod sursa (job #1947821) | Cod sursa (job #137997) | Cod sursa (job #2133803) | Cod sursa (job #2501537)
#include <bits/stdc++.h>
using namespace std;
const long long B = 1e6;
bool c[5 + B];
vector <long long> v;
vector <long long> mu;
void ciur()
{
for(long long i = 2; i <= B; i++)
{
if(c[i] == false)
for(long long j = i * i; j <= B; j+= i)
c[j] = true;
}
for(long long i = 2; i <= B; i++)
if(c[i] == false)
v.push_back(i);
}
long long solve(long long a, long long b)
{
mu.clear();
for(auto x : v)
{
if(x * x > b) continue;
if(x <= b && b % x == 0) mu.push_back(x);
while(b % x == 0) b /= x;
}
if(b > 1) mu.push_back(b);
long long rez(0);
for(long long i = 1; i < (1LL << mu.size()); i++)
{
long long nr(0), p(1);
for(long long j = 0; j < mu.size(); j++)
{
if(i & (1LL << j))
{
nr++;
p *= mu[j];
}
}
if(nr % 2 == 0) rez -= (a / p);
else rez += (a / p);
}
return a - rez;
}
int main()
{
freopen("frac.in", "r", stdin);
freopen("frac.out", "w", stdout);
ciur();
long long m, a, b;
scanf("%lld%lld", &a, &b);
long long r, pas;
r = 0;
pas = 1LL << 50;
while(pas)
{
if(solve(r + pas, a) < b)
r += pas;
pas >>= 1;
}
printf("%lld\n", r + 1);
return 0;
}