Pagini recente » Cod sursa (job #1090374) | Cod sursa (job #1644789) | Cod sursa (job #1119550) | Ciorna | Cod sursa (job #2256583)
#include <fstream>
#define MAX 2000000
#define M 1e18
using namespace std;
bool prim[MAX+5];
int k,nrprim[MAX+5],semn[MAX+5],n;
long long prod[MAX+5];
long long v[MAX+5];
long long pozitie(long long a)
{
int maxi=(1<<n);
long long card=a;
for(int i=1;i<maxi;i++)
card=card+semn[i]*a/prod[i];
return card;
}
void CIUR()
{
for(int i=2;i<=MAX;i++)
if(!prim[i])
{
nrprim[++k]=i;
for(int j=2*i;j<=MAX;j+=i)
prim[j]=1;
}
}
int main()
{
ifstream f("frac.in");
ofstream g("frac.out");
int b,poz;
f>>b>>poz;
CIUR();
for(int i=1;nrprim[i]*nrprim[i]<=b;i++)
{
if(b%nrprim[i]==0)
{
while(b%nrprim[i]==0)
b/=nrprim[i];
v[++n]=nrprim[i];
}
}
if(b>1)
v[++n]=b;
int maxi=(1<<n);
for(int i=1;i<maxi;i++)
{
long long m=0;
prod[i]=1;
for(int j=0;j<n;j++)
if((1<<j)&i)
{
m++;
prod[i]*=v[j+1];
}
if(m%2==0)
semn[i]=1;
else
semn[i]=-1;
}
long long st=1,dr=M;
while(st<dr)
{
long long mij=(st+dr)/2;
if(pozitie(mij)>=poz)
dr=mij;
else
st=mij+1;
}
g<<st;
return 0;
}