Pagini recente » Cod sursa (job #2875560) | Cod sursa (job #3130653) | Cod sursa (job #590025) | Cod sursa (job #2843494) | Cod sursa (job #198158)
Cod sursa(job #198158)
#include <stdio.h>
#include <string.h>
#define NMAX 20
long long n,k,nr,v[NMAX],vec[NMAX],i,m,q,stanga,dreapta1,numar,dreapta2;
long long ver(long long x)
{
long long suma=0,i;
memset(vec,0,sizeof(vec));
while(vec[0]==0)
{
for(i=nr;i>=0;i--)
if(vec[i]==0)
{
vec[i]=1;
break;
}
else vec[i]=0;
long long produs=1,t=0;
for(i=nr;i>=1;i--)
if(vec[i])
{
produs*=v[i];
t=!t;
}
if(produs==1) break;
if(t==0) suma-=x/produs;
else suma+=x/produs;
}
return x-suma;
}
long long cautare(long long a,long long b)
{
long long m;
if(a==b) return a;
m=(a+b)/2;
if(ver(m)>=k)
return cautare(a,m);
else
return cautare(m+1,b);
}
void citire()
{
freopen("frac.in","rt",stdin);
freopen("frac.out","wt",stdout);
scanf("%lld %lld", &n, &k);
}
void descompunere()
{
long long i;
for(i=2;i*i<=n;i++)
if(n%i==0)
{
v[++nr]=i;
while(n%i==0) n/=i;
}
if(n!=0) v[++nr]=n;
}
void solve()
{
citire();
descompunere();
stanga=0;
dreapta1=1000000000;
printf("%lld",cautare(stanga,dreapta1*dreapta1));
}
int main()
{
solve();
return 0;
}