Pagini recente » Cod sursa (job #2939594) | Cod sursa (job #2606715) | Cod sursa (job #2106610) | Cod sursa (job #3267210) | Cod sursa (job #211703)
Cod sursa(job #211703)
#include <stdio.h>
#include <math.h>
#define N 15
long long n,p,prim[N];
void precalc(){
long long rad,i,cop;
int c;
//for(i=0;i<=N;i++)
// prim[i]=1;
rad=(long long)sqrt(n);cop=n;
for(i=2;i*i<=cop;i++){
for(c=0;cop%i==0;cop/=i,c++);
if(c) prim[++prim[0]]=i;
}
if(cop) prim[++prim[0]]=cop;
for(i=prim[0]+1;i<=N;i++)
prim[i]=1;
}
void calcul(int x, int &nrbiti,long long &prod){
nrbiti=0;prod=1;
int c=0;
while(x){
c++;
if(x&1) {
nrbiti++;
prod*=prim[c];
}
x/=2;
}
}
long long f(long long x){
int nrbiti=0;
long long s=x,prod=1;
for(int i=1;i<(1<<prim[0]);i++){
calcul(i,nrbiti,prod);
if(nrbiti&1)
s-=x/prod;
else s+=x/prod;
}
return s;
}
int main(){
long long st=1,dr=1LL<<61-1,m;
freopen("frac.in","r",stdin);
freopen("frac.out","w",stdout);
scanf("%lld%lld",&n,&p);
precalc();
while(st<dr){
m=(st+dr)>>1;
if(f(m)>=p) dr=m;
else st=m+1;
}
printf("%lld\n",st);
return 0;
}