Pagini recente » Cod sursa (job #652674) | Cod sursa (job #1921006) | Cod sursa (job #1009526) | Cod sursa (job #334131) | Cod sursa (job #2810778)
#include <fstream>
using namespace std;
ifstream cin("frac.in");
ofstream cout("frac.out");
int prime[70000],k=0;
long long MaiMicCaAPrimCuB(long long a) {
long long ans = 0;
for(int mask = 0; mask < (1 << k); mask++) {
long long cnt = 0,prod = 1;
for(int j = 0; j < k; j++) {
if((1 << j) & mask) {
cnt++;
prod *= prime[j];
}
}
ans += ((cnt & 1) ? -1 : 1) * (a / prod);
}
return ans;
}
int main() {
long long last,a,b,rez,st=1,dr=1e18,mid;
cin>>a>>b;
//cout<<a<<" "<<b<<endl;
for(long long j = 2; j * j <= a; j++) {
//cout<<a<<" "<<j<<endl;
if(a % j == 0) {
prime[k] = j;
k++;
}
while(a % j == 0)
a /= j;
}
if(a > 1) {
prime[k] = a;
k++;
}
//cout<<k<<endl;
while(st<dr){
mid=(st+dr)/2;
//cout<<mid<<endl;
if(MaiMicCaAPrimCuB(mid)>b)
dr=mid-1;
else if(MaiMicCaAPrimCuB(mid)<b)
st=mid+1;
else if(MaiMicCaAPrimCuB(mid)==b){
last=mid;
dr=mid-1;
}
}
cout<<last;
return 0;
}