Pagini recente » Cod sursa (job #422323) | Cod sursa (job #719746) | Monitorul de evaluare | Cod sursa (job #954539) | Cod sursa (job #3353188)
#include <bits/stdc++.h>
using namespace std;
int primi[10];
long long rasp(long long a, long long n, int ap)
{
long long raspuns = 0, scad;
for(int i = 1; i < (1 << ap); i++)
{
scad = 1;
for(int j = 0; j < ap; j++)
{
if(((i >> j) & 1) == 1)
{
scad *= primi[j];
}
}
if(__builtin_popcount(i) % 2 == 0)
raspuns -= a / scad;
else raspuns += a / scad;
}
return raspuns;
}
int main()
{
ifstream cin("frac.in");
ofstream cout("frac.out");
int ap = 0;
long long st, dr, mij, n, cn, ras, d, p, rez;
cin >> n >> p;
d = 2;
cn = n;
while(d * d <= n)
{
if(n % d == 0)
{
primi[ap++] = d;
//printf("1");
while(n % d == 0)
{
n /= d;
}
}
d++;
}
if(n > 1)
primi[ap++] = n;
n = cn;
st = 1;
dr = LLONG_MAX;
while(st <= dr)
{
mij = (st + dr) / 2;
//printf("%lld ",mij);
rez = rasp(mij, n, ap);
rez = mij - rez;
if(rez < p)
{
st = mij + 1;
}
else
{
ras = mij;
dr = mij - 1;
}
}
cout << ras;
return 0;
}