Pagini recente » Cod sursa (job #2406050) | Cod sursa (job #1999980) | Cod sursa (job #2842250) | Cod sursa (job #1870390) | Cod sursa (job #2855355)
#include <iostream>
#include <fstream>
#include <vector>
std::ifstream fin("frac.in");
std::ofstream fout("frac.out");
using namespace std;
typedef long long ll;
ll N,P;
ll K;
vector<int> vp;
ll rez;
void FindPrimes(ll x)
{
ll d,exp;
for(d=2,exp=0;x%d==0;x/=d,exp++);
if(exp)
vp.push_back(d);
for(d=3;d*d<=x;d+=2)
{
for(exp=0;x%d==0;x/=d,exp++);
if(exp)
vp.push_back(d);
}
if(x>1)
vp.push_back(x);
}
ll Inclusion_Exlusion(ll LIM)
{
ll ret=0;
for(ll bitmask=1;bitmask<(1<<K);bitmask++)
{
ll prod=1,cnt=0;
for(ll i=0;i<K;i++)
if((bitmask & (1<<i))!=0)
{
prod*=vp[i];
cnt++;
}
if(cnt%2!=0)
ret+=LIM/prod;
else
ret-=LIM/prod;
}
return LIM-ret;
}
ll BinarySearch()
{
ll st=1, dr=8223372036854775807;
ll ans=0;
while(st<=dr)
{
ll mij=(st+dr)/2;
ll pozitie=Inclusion_Exlusion(mij);
if(pozitie>=P)
{
if(pozitie==P)
ans=mij;
dr=mij-1;
}
else
st=mij+1;
}
return ans;
}
int main()
{
fin>>N>>P;
FindPrimes(N);
K=vp.size();
rez=BinarySearch();
fout<<rez;
return 0;
}