Cod sursa(job #265090)

Utilizator savimSerban Andrei Stan savim Data 23 februarie 2009 11:24:14
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#include <math.h>
#define LL long long

LL n, p, rad, d, m, st, dr, mid, nr, sol;
LL fact[110];

LL calc_div(LL val) {
    LL rez = 0, n0;
    for (LL i = 1; i < (1 << m); i++) {
        n0 = 0; d = 1;
        for (LL j = 0; j < m; j++)
            if (i & (1 << j)) {
                n0++;
                d *= fact[j + 1];
            }
        if (n0 % 2 == 1) rez += val / d;
        else rez -= val / d;
    }
    
    return rez;
}

int main() {
    freopen("frac.in", "r", stdin);
    freopen("frac.out", "w", stdout);
    
    scanf("%lld %lld", &n, &p);
    
    rad = (LL) sqrt(n); d = 1;
    while (d < rad && n != 1) {
        d++;
        if (n % d == 0) fact[++m] = d;
        while (n % d == 0) n /= d;
    }
    if (n != 1) fact[++m] = n;
    
    st = 0; dr = ((LL) 1 << 61); mid = 0;
    while (st + 1 < dr) {
          mid = (st + dr) / 2;
          
          nr = mid - calc_div(mid);
          if (nr == p)
             sol = mid;
          if (nr >= p) dr = mid;
          else st = mid;
    }

    printf("%lld\n", sol);

    return 0;
}