Pagini recente » Cod sursa (job #2173517) | Cod sursa (job #1257708) | Cod sursa (job #1050438) | Cod sursa (job #2631929) | Cod sursa (job #2037312)
#include <iostream>
#include <cstdio>
#define BIG 9223372036854775807
using namespace std;
char ciur[110001];
int prime[11000];
long long divi[20];
int k;
long long value(long long A){
long long sol,p;
int i,j,nr;
sol=0;
for(i=1;i<(1<<k);i++){
p=1;
nr=0;
for(j=0;j<k;j++)
if((1<<j)&i){
p=1LL*p*divi[j+1];
nr++;
}
if(nr%2==0)
nr=-1;
else
nr=1;
sol=sol+1LL*nr*(A/p);
}
sol=A-sol;
return sol;
}
long long cauta(long long li, long long ls, long long BUN){
long long mij,val;
while(li<=ls){
mij=(1LL*li+1LL*ls)/(1LL*2);
val=value(mij);
if(val>=BUN)
ls=mij-1;
else
li=mij+1;
}
return ls+1;
}
int main(){
FILE *fin, *fout;
int i,j,pun,d;
long long sol,P,B,x;
fin=fopen("frac.in","r");
fout=fopen("frac.out","w");
for(i=2;i*i<=110000;i++)
if(ciur[i]==0){
for(j=i*i;j<=110000;j+=i)
ciur[j]=1;
}
pun=0;
for(i=2;i<=110000;i++)
if(ciur[i]==0)
prime[++pun]=i;
fscanf(fin,"%lld %lld\n",&B,&P);
k=0;
pun=1;
d=prime[pun];
while(d*d<=B && B>1){
if(B%d==0){
divi[++k]=d;
while(B%d==0)
B/=d;
}
d=prime[++pun];
}
if(B>1)
divi[++k]=B;
x=cauta(1,BIG,P);
fprintf(fout,"%lld\n",x);
fclose(fin);
fclose(fout);
return 0;
}