Pagini recente » Cod sursa (job #146893) | Cod sursa (job #2396676) | Cod sursa (job #1528215) | Cod sursa (job #2110654) | Cod sursa (job #1073442)
#include <cstdio>
#include <cmath>
typedef long long ll;
using namespace std;
ll N, P;
bool p[110000];
int primes[10460], Pr;
ll dividePrimes[40], D;
void read() {
freopen( "frac.in", "r", stdin );
freopen( "frac.out", "w", stdout );
scanf("%lld %lld", &N, &P);
}
void precomputePrimes() {
Pr = 0;
for(int i = 2; i <= 110000; i++)
if(!p[i]) {
primes[Pr] = i;
Pr++;
for(int j = 2*i; j <= 110000; j+=i)
p[j] = true;
}
}
ll inline divide(ll B, int p) {
while(!(B % p))
B /= p;
return B;
}
void getDividePrimes(ll B) {
D = 0;
for(int i = 0; i < Pr && primes[i] <= sqrt(B); i++)
if (B % primes[i] == 0){
dividePrimes[D] = primes[i];
D++;
B = divide(B, primes[i]);
}
if ( B > 1 ) {
dividePrimes[D] = B;
D++;
}
}
ll getFactor(ll count) {
ll p = 1;
for(int i = 0; i < D; i++) {
if ( count & 1 )
p *= -1;
else
p *= dividePrimes[i];
count >>= 1;
}
return p;
}
ll compute(ll B) {
ll result = 0;
ll count = 1 << D;
while( count ) {
result += B / getFactor(count);
count--;
}
if( result > 0 )
return result;
else
return -result;
}
void binarySearch(ll l, ll r) {
ll C = -1;
ll m;
while( C != P ) {
m = (l + r) / 2;
C = compute(m);
if ( C < P )
l = m;
else
r = m;
}
while( C == P ) {
C = compute(--m);
}
printf("%lld", m + 1);
}
int main() {
read();
precomputePrimes();
getDividePrimes(N);
ll r = 1l << 61;
binarySearch(1, r);
return 0;
}