Pagini recente » Cod sursa (job #2362004) | Cod sursa (job #1457538) | Istoria paginii runda/001./clasament | Cod sursa (job #2779045) | Cod sursa (job #2780083)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>
#define ll long long
using namespace std;
ifstream fin( "frac.in" );
ofstream fout( "frac.out" );
const ll INF = 1e18;
vector<int> f;
ll _count( ll x ) {
int n = f.size();
ll res = 0;
for ( int i = 0; i < (1 << n); ++i ) {
int m = i, cnt = 0;
ll d = 1;
for ( int j = 0; j < n; ++j ) {
if ( m & 1 ) {
d *= f[j];
++cnt;
}
m >>= 1;
}
if ( cnt & 1 ) {
res -= x / d;
} else {
res += x / d;
}
}
return res;
}
void solve( ll p ) {
ll l = 0, r = INF, mid;
while ( r - l > 1 ) {
mid = (l + r) / 2;
if ( _count( mid ) < p ) {
l = mid;
} else {
r = mid;
}
}
fout << r;
}
int main() {
ll n, p;
int d = 2, k;
fin >> n >> p;
while ( d * d <= n ) {
k = 0;
while ( n % d == 0 ) {
n /= d;
k = 1;
}
if ( k ) f.push_back( d );
++d;
}
if ( n > 1 ) f.push_back( n );
solve( p );
fin.close();
fout.close();
return 0;
}