Cod sursa(job #2872937)

Utilizator andreic06Andrei Calota andreic06 Data 18 martie 2022 10:20:02
Problema Frac Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#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;
}