Pagini recente » Cod sursa (job #882022) | Cod sursa (job #2195291) | Cod sursa (job #2692215) | Monitorul de evaluare | Cod sursa (job #3353185)
#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 = 0; i <= ap; i++)
{
raspuns += a / primi[i];
}
for(int i = 0; i < (1 << ap + 1); i++)
{
if(__builtin_popcount(i) > 1)
{
scad = 1;
for(int j = 0; j <= ap; j++)
{
if((i >> j) & 1 == 1)
{
scad *= primi[j];
}
}
raspuns -= a / scad;
}
}
return raspuns;
}
int main()
{
ifstream cin("frac.in");
ofstream cout("frac.out");
int p, rez, d, ap = 0;
long long st, dr, mij, n, cn, ras;
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;
ap--;
st = 1;
dr = INT_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;
}