Pagini recente » Cod sursa (job #3122262) | Cod sursa (job #1707464) | Cod sursa (job #1833989) | Cod sursa (job #2683608) | Cod sursa (job #2872937)
#include <iostream>
#include <fstream>
using namespace std;
using LL = long long;
const LL NMAX = 12e9;
const int SQRT_MAX = 11e4;
bool ciur[1 + SQRT_MAX];
LL prime_array[1 + SQRT_MAX]; int k;
void def_prime () {
ciur[0] = ciur[1] = true; /// composed
for ( int i = 2; i * i <= SQRT_MAX; i ++ )
if ( ciur[i] == false )
for ( int j = i * i; j <= SQRT_MAX; j += i )
ciur[j] = true;
for ( int number = 2; number <= SQRT_MAX; number ++ )
if ( ciur[number] == false )
prime_array[++ k] = number;
}
LL n, pos;
LL prime_div[1 + SQRT_MAX]; int card;
void decompose () {
int index = 1;
while ( index <= k && (long long)prime_array[index] * prime_array[index] <= n ) {
if ( n % prime_array[index] == 0 )
prime_div[++ card] = prime_array[index];
while ( n % prime_array[index] == 0 )
n /= prime_array[index];
index ++;
}
if ( n > 1 )
prime_div[++ card] = n;
}
int count_bits ( int x ) {
int answer = 0;
while ( x ) {
answer ++;
x -= (x & -x);
}
return answer;
}
LL status ( LL input ) {
LL answer = 0; int bit_mask = 1 << card;
for ( int mask = 1; mask < bit_mask; mask ++ ) {
LL prod = 1;
for ( int bit = 0; bit < card; bit ++ )
if ( mask & (1 << bit) )
prod *= prime_div[1 + bit];
int sign = count_bits ( mask );
if ( sign % 2 == 0 )
answer -= input / prod;
else
answer += input / prod;
}
return input - answer;
}
LL solve () {
LL left = 1, right = 2 * NMAX, answer = -1;
while ( left <= right ) {
LL mid = left + ( right - left ) / 2;
LL decide = status ( mid );
if ( decide >= pos ) {
right = mid - 1;
answer = mid;
}
else
left = mid + 1;
}
return answer;
}
ifstream fin ( "frac.in" );
ofstream fout ( "frac.out" );
int main()
{
fin >> n >> pos;
def_prime (); decompose ();
fout << solve ();
return 0;
}