Pagini recente » Cod sursa (job #820754) | Cod sursa (job #178796) | Cod sursa (job #2509665) | Cod sursa (job #2983997) | Cod sursa (job #1981250)
#include <stdio.h>
#define lim 10000000
bool ciur[lim+5];
int v[lim/3],d[lim/3];
void ciuruire(){
int i,j;
for(i=2;i*i<lim;i++)
if(ciur[i]==false)
for(j=i*i;j<lim;j+=i)
ciur[j]=true;
ciur[0]=true;
ciur[1]=true;
for(i=2;i<=lim;i++)
if(ciur[i]==false){
v[0]++;
v[v[0]]=i;
}
}
long long cate(long a, long long b){
long long i,j,c,nrd,nr,s,val;
c=b;
nrd=0;
for(i=1;i<=v[0]&&v[i]*v[i]<=b;i++)
if(b%v[i]==0){
d[nrd]=v[i];
nrd++;
while(c%v[i]==0)
c=c/v[i];
}
if(c!=1){
d[nrd]=c;
nrd++;
}
s=0;
for(i=0;i<(1<<nrd);i++){
val=1;
nr=0;
for(j=0;j<nrd;j++)
if(i&(1<<j)){
val=val*(long long)d[j];
nr++;
}
if(nr%2==0)
s+=a/val;
else
s-=a/val;
}
return s;
}
int main(){
FILE *fin,*fout;
fin=fopen("pinex.in","r");
fout=fopen("pinex.out","w");
long long a,b,st,dr,pp=0,n,rasp=0;
ciuruire();
fscanf(fin,"%lld%lld",&b,&n);
st=1;
dr=1000000000000000000;
while(st<=dr&&pp==0){
a=(st+dr)/2;
if(cate(a,b)==n){
pp=1;
rasp=a;
}
if(cate(a,b)<n)
st=a+1;
if(cate(a,b)>n)
dr=a-1;
}
fprintf(fout,"%lld",rasp);
fclose(fin);
fclose(fout);
return 0;
}