Cod sursa(job #2279472)

Utilizator ValentinSavoiuFMI Savoiu Valentin-Marian ValentinSavoiu Data 9 noiembrie 2018 16:48:32
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream> // reimplementare pentru lab ASD
#include <algorithm>
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
int divprim[31], nrdiv = -1;
long long N, P, d, aux, mask, Max;
long long check (long long x) {
    long long Last = 1 << (nrdiv + 1);
    long long sol = 0;
    for (int i = 1; i < Last ; i++) {
        int cnt = -1;
        long long prod = 1;
        for (int j = 0 ; j <= nrdiv; j++) {
            if (i & (1LL << j) ) {
                prod = prod * divprim[j];
                cnt *= -1;
            }
        }
        sol = sol + cnt * x / prod;
    }
    return x - sol;
}
long long cautbin (long long P) {
    long long sol = 0;
    while (mask) {
        long long test = sol + mask;
        if (test <= Max) {
            long long val = check(test);
            if (val < P) sol = test;
        }
        mask >>= 1;
    }
    return sol + 1;
}
int main() {
    f >> N >> P;
    aux = N;
    if (N % 2 == 0) {
        while (N % 2 == 0)
            N /= 2;
        divprim[++nrdiv] = 2;
    }
    d = 3;
    while(d * d <= N) {
        if (N % d == 0) {
            while (N % d == 0)
                N /= d;
            divprim[++nrdiv] = d;
        }
        d += 2;
    }
    if (N != 1)
        divprim[++nrdiv] = N;
    N = aux;
    mask = 1LL << 61;
    Max = 1LL << 61;
    g << cautbin(P);
    return 0;
}