Cod sursa(job #1117009)

Utilizator smaraldaSmaranda Dinu smaralda Data 22 februarie 2014 22:59:24
Problema Frac Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<stdio.h>
#include<math.h>

const int NMAX = 6e6;

long long n, p, subm[NMAX + 5];

long long count (long long x) {
    int i;
    long long ans = x;

    for(i = 1; i <= subm[0]; i++)
        ans += x / subm[i];
    return ans;
}

long long bs (long long left, long long right) {
    long long mid, last;

    while(left <= right) {
        mid = right + (left - right) / 2;
        if(count(mid) >= p)
            last = mid,
            right = mid - 1;
        else
            left = mid + 1;
    }
    return last;
}

void fact () {
    long long p, bit, cnt, d, lim, s, cn, f[30];
    int e;

    d = 2;
    e = f[0] = 0;
    cn = n;
    lim = sqrt(cn);
    while(cn > 1 && d <= lim) {
        while(cn % d == 0)
            e = 1,
            cn /= d;
        if(e)
            f[++f[0]] = d;
        ++d;
    }
    if(cn > 1)
        f[++f[0]] = cn;

    for(s = 1; s < (1 << f[0]); s++) {
        cnt = 0;
        p = 1;
        for(bit = 0; bit < f[0]; bit++)
            if(s & (1 << bit))
                ++cnt,
                p *= f[bit + 1];
        if(cnt % 2 == 1)
            p *= -1;
        subm[++subm[0]] = p;
    }
}

int main() {
    freopen("frac.in","r",stdin);
    freopen("frac.out","w",stdout);

    scanf("%lld%lld",&n,&p);

    fact();
    printf("%lld\n",bs(1, (long long)1 << 61));
    return 0;
}