Pagini recente » Cod sursa (job #2547650) | Cod sursa (job #3341791)
#include <bits/stdc++.h>
using namespace std;
const long long MAX = 1LL << 61;
vector <long long> d;
long long check( long long val, vector <long long> &d ){
long long ans, p, cnt, i, b;
ans = 0;
for( i = 1; i < ( 1LL << d.size() ); i++ ){
p = 1;
cnt = 0;
for( b = 0; b < d.size(); b++ ){
if( ( i & ( 1LL << b )) ){
p *= d[b];
cnt++;
}
if( p > val )
break;
}
if( b == d.size() ){
if( cnt % 2 == 1 )
ans += val / p;
else if( cnt > 0 )
ans -= val / p;
}
}
return val - ans;
}
long long cb( long long st, long long dr, long long p ){
long long mid, ans = dr;
while( st <= dr ){
mid = ( st + dr ) / 2;
if( check(mid, d) >= p ){
ans = mid;
dr = mid - 1;
}
else
st = mid + 1;
}
return ans;
}
int main(){
ifstream cin( "frac.in" );
ofstream cout( "frac.out" );
long long n, i, p;
cin >> n >> p;
i = 2;
while( i * i <= n ){
if( n % i == 0 ){
d.push_back( i );
while( n % i == 0 )
n /= i;
}
i++;
}
if( n > 1 )
d.push_back(n);
cout << cb( 1, MAX, p );
return 0;
}