Pagini recente » Cod sursa (job #541358) | Cod sursa (job #2874280) | Borderou de evaluare (job #472912) | Cod sursa (job #1011060) | Cod sursa (job #3166723)
#include <bits/stdc++.h>
#ifdef LOCAL
#define in cin
#define out cout
#endif
#define int int64_t
using namespace std;
#ifndef LOCAL
ifstream in("frac.in");
ofstream out("frac.out");
#endif
const int nmax = 2e5;
vector<int> primes;
int ciur[nmax];
void doCiur()
{
primes.push_back(2);
for(int i=3;i<nmax;i+=2)
{
if(!ciur[i])
{
primes.push_back(i);
for(int j=i*i;j<nmax;j+=i)
{
ciur[j]=1;
}
}
}
}
vector<int> getDivs(int nr)
{
vector<int> res;
for(auto i:primes)
{
if(nr%i==0)
{
res.push_back(i);
}
}
for(auto i:primes)
{
while(nr%i==0)
{
nr/=i;
}
}
if(nr!=1)res.push_back(nr);
return res;
}
int total;
int nrOfNrs(int nr)
{
return total/nr;
}
void bkt(vector<int> &v,int &res,int ind=0,int sign=1,int prod=1)
{
if(v.size()==ind)
{
res+=sign*nrOfNrs(prod);
}
else
{
bkt(v,res,ind+1,sign,prod);
bkt(v,res,ind+1,sign*-1,prod*v[ind]);
}
}
signed main()
{
doCiur();
int n,p;in>>n>>p;
auto v=getDivs(n);
int st=1,dr=__LONG_LONG_MAX__/2;
while(st<dr)
{
total=(st+dr)/2;
int res=0;
bkt(v,res);
if(res<p)
{
st=total+1;
}
else
{
dr=total;
}
}
out<<st;
}