Pagini recente » Cod sursa (job #2087860) | Cod sursa (job #2907647) | Cod sursa (job #1913738) | Cod sursa (job #627832) | Cod sursa (job #2417386)
#include <fstream>
#include <vector>
#define ll long long
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
ll n, p;
vector <ll> v;
void divizori(ll x)
{
ll d = 2;
if(x % d == 0)
{
while(x % d == 0)
x /= d;
v.push_back(d);
}
d = 3;
while(d * d <= x && x > 1)
{
if(x % d == 0)
{
while(x % d == 0)
x /= d;
v.push_back(d);
}
d += 2;
}
if(x > 1) v.push_back(x);
}
ll pinex(ll x)
{
ll ans, maxim;
ans = 0;
maxim = 1LL << v.size();
for(ll i = 1; i < maxim; ++i)
{
ll prod = 1;
ll nr = 0;
for(ll j = 0; j < v.size(); ++j)
if(i & (1LL << j))
{
nr++;
prod *= v[j];
}
if(nr % 2 == 1)
ans += x / prod;
else ans -= x/ prod;
}
return ( x - ans >= p);
}
int main()
{
f >> n >> p;
divizori(n);
ll st = 1, dr = (1LL << 61), last = 1;
while(st <= dr)
{
ll mij = (st + dr)/ 2 ;
if(pinex(mij))
dr = mij - 1, last = mij;
else st = mij + 1;
}
g << last;
f.close(); g.close();
return 0;
}