Cod sursa(job #2871639)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 15 martie 2022 11:30:30
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
//
// Created by Mihai145 on 3/15/2022.
//

#include <fstream>
#include <vector>

long long count(long long n, std::vector<long long>& primes) {
    long long ans = 0;

    for(int mask = 0; mask < (1 << (int)primes.size()); ++mask) {
        long long prod = 1LL;
        for(int b = 0; b < (int)primes.size(); b++) {
            if(mask & (1 << b)) {
                prod *= primes[b];
            }
        }

        if(__builtin_popcount(mask) & 1) {
            ans -= n / prod;
        } else {
            ans += n / prod;
        }
    }

    return ans;
}

void calc_primes(long long n, std::vector<long long>& primes) {
    for(int i = 2; 1LL * i * i <= n; ++i) {
        if(n % i == 0) {
            primes.push_back(i);
            while(!(n % i)) { n /= i; }
        }
    }

    if(n != 1) {
        primes.push_back(n);
    }
}

int main() {
    std::ifstream cin("frac.in");
    std::ofstream cout("frac.out");

    long long n, p;
    cin >> n >> p;

    std::vector<long long> primes;
    calc_primes(n, primes);

    long long l = 1, r = (1LL << 61), sol = -1;

    while(l <= r) {
        long long mid = (l + r) >> 1;

        if(count(mid, primes) >= p) {
            sol = mid;
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }

    cout << sol << '\n';
    return 0;
}