Pagini recente » Cod sursa (job #1789399) | Cod sursa (job #3268263) | Cod sursa (job #3254752) | Cod sursa (job #1807603) | Cod sursa (job #1018556)
#include <fstream>
#include <cmath>
#define maxrez 1LL*(1<<30)*(1<<30)*2+1
#define ll long long
using namespace std;
ifstream fin("frac.in");
ofstream fout("frac.out");
ll fac[100001],lo,hi,prod,mid,n,P,s;
bool v[1000001];
ll p[100001],t,f;
void erathostenes (int n)
{
p[1] = 2;
t=1;
for (int i=3; i<=n; ++i)
{
if (!v[i])
p[++t] = i;
for (int j=i*i; j<=n; ++j)
{
v[j] = 1;
}
}
}
void decompose (ll n)
{
for (int i=1; i<=t; ++i)
{
if (n%p[i] == 0)
{
fac[++f] = p[i];
while (n%p[i]==0)
{
n /= p[i];
}
}
}
if (n!=1)
{
fac[++f] = n;
}
}
void subsets (int k, int nr)
{
for (int i=k; i<=f; ++i)
{
prod *= fac[i];
subsets (i+1,nr+1);
prod /= fac[i];
}
if (nr%2)
{
s += mid/prod;
}
else if (nr!=0)
{
s -= mid/prod;
}
}
int main()
{
fin>>n>>P;
erathostenes (sqrt(n)+1);
decompose (n);
lo = -1, hi = maxrez;
while (hi-lo > 1)
{
mid = (lo+hi)/2;
prod = 1;
s=0;
subsets (1,0);
if (mid <= s+P-1)
lo = mid;
else
hi = mid;
}
fout<<hi;
}