Cod sursa(job #1150235)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 22 martie 2014 18:35:33
Problema Frac Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>
using namespace std;

long long P, ans;
int prim[13], nr, lim;

inline void preC (long long N) {

    int k = 2;
    while (N > 1) {
        if (!(N % k)) {
            prim[++nr] = k;
            while (!(N % k))
                N /= k;
        }
        if (k * k > N && N > 1) {
            prim[++nr] = N;
            break;
        }
        ++k;
    }

}

inline long long pinex (const long long &L) {

    long long l, r = 0;
    int i, j, p;
    for (i = 1; i < lim; ++i) {
        p = 0;
        l = 1;
        for (j = 0; j < nr; ++j)
            if ((i >> j) & 1) {
                ++p;
                l *= prim[j + 1];
            }
        if (p & 1)
            r += L / l;
        else
            r -= L / l;
    }
    ans = L - r;

}

inline void bsearch () {

    long long left = 1, right = (1LL << 61), middle;
    lim = (1 << nr);
    while (left <= right) {
        middle = (1LL * (left + right)) >> 1;
        pinex (middle);
        if (ans >= P)
            right = middle - 1;
        else
            left = middle + 1;
    }
    printf ("%lld", middle);

}

int main () {

    freopen ("frac.in", "r", stdin);
    freopen ("frac.out", "w", stdout);
    long long N;
    scanf ("%lld%lld", &N, &P);
    preC (N);
    bsearch ();

}