Pagini recente » Cod sursa (job #1567139) | Cod sursa (job #798468) | Istoria paginii runda/aib | Autentificare | Cod sursa (job #1764468)
#include <iostream>
#include<fstream>
#include<bitset>
#include<climits>
#define ll long long
using namespace std;
ifstream f ("frac.in");
ofstream g ("frac.out");
long long pr[100],d[1025],nr,nrd,n,p,i,k,v[100],sum,desc,px,u,m;
bitset<105> used;
inline void precalcprimes()
{
if(n%2==0)
{
nr=1;
pr[nr]=2;
while(n%2==0) n/=2;
}
i=3;
while(n!=1)
{
if(n%i==0)
{
while(n%i==0) n/=i;
nr++;
pr[nr]=i;
}
i+=2;
}
}
void bk(ll x,ll prod)
{
if(x>k)
{
nrd++;
d[nrd]=prod;
if(k%2==0) d[nrd]*=-1;
}
else
{
for(int i=v[x-1]+1;i<=nr;i++)
{
if(!used[i])
{
used[i]=1;
v[x]=i;
bk(x+1,prod*pr[v[x]]);
used[i]=0;
}
}
}
}
ll num(ll x)
{
sum=0;
for(i=1;i<=nrd;i++) sum+=x/d[i];
return (x-(sum));
}
int main()
{
ifstream f("frac.in");
ofstream g("frac.out");
f>>n>>px;
precalcprimes();
for(k=1;k<=nr;k++)
{
bk(1,1);
}
p=0;u=LLONG_MAX;
while(u-p>1)
{
m=p+(u-p)/2;
if(num(m)<px) p=m;
else u=m;
}
g<<u;
return 0;
}