Pagini recente » Cod sursa (job #165638) | Cod sursa (job #2520114) | Cod sursa (job #1791163) | Cod sursa (job #952129) | Cod sursa (job #907845)
Cod sursa(job #907845)
#include<stdio.h>
#define ndmax 25
#define nelmax 3000
#define vmax 12000000001
long long d, n, p, nd, nel, i, nr, val, nrnumdc, nrnumfdc, st, dr, mjc, k;
long long v[nelmax], smn[nelmax], div[ndmax];
bool ok;
void descomp()
{
d=2;
while (d*d<=n)
{
p=0;
while(n%d==0)
{ n/=d; p++; }
if (p>0)
div[++nd]=d;
d++;
}
if (n>1)
div[++nd]=d;
}
void gen(long poz)
{
if (poz==nd+1)
{
if (val>1)
{
v[++nel]=val;
if (nr%2==0)
smn[nel]=-1;
else
smn[nel]=1;
}
}
else
{
gen(poz+1);
val=val*div[poz]; nr++;
gen(poz+1);
val=val/div[poz]; nr--;
}
}
void verificare()
{
nrnumdc=0;
for (i=1;i<=nel;i++)
nrnumdc+=(mjc/v[i])*smn[i];
nrnumfdc=mjc-nrnumdc;
}
void rezolvare()
{
st=1; dr=vmax;
while (st<=dr)
{
mjc=(st+dr)/2;
verificare();
if (nrnumfdc>=k)
dr=mjc-1;
else
st=mjc+1;
}
printf("%lld\n",st);
}
int main()
{
freopen("frac.in","r",stdin);
freopen("frac.out","w",stdout);
scanf("%lld %lld",&n,&k);
descomp();
val=1; gen(1);
rezolvare();
return 0;
}