Cod sursa(job #2780083)

Utilizator euyoTukanul euyo Data 5 octombrie 2021 22:25:14
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.96 kb
#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;
}