Cod sursa(job #2518709)

Utilizator ioanasIoana S ioanas Data 6 ianuarie 2020 14:32:18
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <vector>
#include <climits>
#include <cmath>

using namespace std;

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

vector<bool> prim(1000000);
vector<int> prims;
vector<int> divs (1000000);

long long N, P, card_u, A;
int n;

void rec(int pos, int left, long res) {
    if (pos == n) {
        if (!left) card_u += A / res;
        return;
    }
    if (!left) {
        card_u += A / res;
        return;
    }

    rec(pos+1, left, res);
    rec(pos+1, left-1, res * divs[pos]);
}

int main() {
    for (int i = 2; i < 1000000; i++)
        if (!prim[i]) {
            prims.push_back(i);
            for (int j = 2 * i; j < 1000000; j += i)
                prim[j] = 1;
        }

    in >> N >> P;

    n = 0;

    for (int prim : prims) {
        if (prim > N) break;
        if (N % prim == 0)
            divs[n++] = prim;
    }

    long long left = 1, right = LLONG_MAX;
    long long res = -1;
    while (left <= right) {
        A = left + (right - left) / 2;
        card_u = 0;

        for (int j = 1; j <= n; ++j) {
            if (j % 2 == 1) rec(0, j, 1);
            else rec(0, j, -1);
        }

        if (A - card_u == P) {
            res = A;
            right = A - 1; 
        } else if (A - card_u > P) {
            right = A - 1;
        } else {
            left = A + 1;
        }
    }

    out << res;
}