Cod sursa(job #3283843)

Utilizator alexvali23alexandru alexvali23 Data 10 martie 2025 16:24:42
Problema Frac Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("frac.in");
ofstream g("frac.out");

long long N, P, R, divp[20];
int nrd, nt;

void divizorip(long long x) {
    nrd = 0;
    if (x % 2 == 0) {
        divp[++nrd] = 2;
        do {
            x /= 2;
        } while (x % 2 == 0);
    }
    for (long long i = 3; i * i <= x; i += 2) {
        if (x % i == 0) {
            divp[++nrd] = i;
            do {
                x /= i;
            } while (x % i == 0);
        }
    }
    if (x > 1) {
        divp[++nrd] = x;
    }
}

long long calcul(long long x) { // Calculate how many prime numbers with N are ≤ x
    long long rez = x;
    for (int i = 1; i < nt; i++) {
        long long prod = 1;
        for (int j = 0, p2; (p2 = 1 << j) <= i; j++) {
            if (i & p2) {
                prod *= -divp[j + 1];
            }
        }
        rez += x / prod;
    }
    return rez;
}

int main() {
    f >> N >> P;
    divizorip(N);
    nt = nrd + 1;
    long long p = 1;
    long long u = 1LL << 61; // Ensures that the result does not exceed 2^61

    while (p < u) {
        long long m = (p + u) / 2;
        if (calcul(m) < P) {
            p = m + 1;
        } else {
            R = m;
            u = m - 1;
        }
    }

    g << R;
    f.close();
    g.close();
    return 0;
}