Pagini recente » Cod sursa (job #1293629) | Cod sursa (job #191696) | Cod sursa (job #2004674) | Cod sursa (job #3219085) | Cod sursa (job #3384)
Cod sursa(job #3384)
#include<stdio.h>
#include<math.h>
#define fin "frac.in"
#define fout "frac.out"
#define NMAX 1000000000L
long long n,p,tmp,desc[1000],st=1,dr;
int x[100];
FILE *in,*out;
void desc_f(long long a) {
long long i,lim;
lim=(long long)sqrt(a);
i=2;
while (a!=1 && i<=lim) {
if (a%i==0) {
while (a%i==0) a/=i;
desc[++desc[0]]=i;
++i;
}
else ++i;
}
if (a!=1) desc[++desc[0]]=a;
}
void go(int i,long long a) {
int val,j;
long long aux;
for (val=x[i-1]+1;val<=desc[0];++val) {
x[i]=val;
aux=1;
for (j=1;j<=i;++j) aux*=desc[x[j]];
if (i%2) tmp=tmp+(a/aux);
else tmp=tmp-(a/aux);
go(i+1,a);
}
}
int main() {
register long long m,nr1,nr2;
in=fopen(fin,"r"); out=fopen(fout,"w");
fscanf(in,"%lld%lld",&n,&p);
desc_f(n);
st=1; dr=1000000000L;
//fprintf(out,"%lld\n",dr);
while (1) {
if (st>dr) break;
m=(st+dr)/2;
tmp=0; go(1,m); nr1=m-tmp;
tmp=0; go(1,m-1); nr2=(m-1)-tmp;
if (nr1==p && nr2<p) break ;
else
if (p<=nr1) dr=m-1;
else st=m+1;
}
fprintf(out,"%lld\n",m);
fclose(in); fclose(out);
return 0;
}