Cod sursa(job #1897758)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 1 martie 2017 17:54:55
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>

using namespace std;

typedef long long int lint;

int sz;
int primes[10];
lint prod[1 << 10];
int sign[1 << 10];

void prec() {
    for (int i = 0; i < (1 << sz); ++ i) {
        prod[i] = sign[i] = 1;
        for (int j = 0; j < sz; ++ j)
            if (i & (1 << j))
                prod[i] *= primes[j], sign[i] *= (-1);
    }
}

lint doCount(lint bound) {
    lint ans = 0;
    for (int i = 0; i < (1 << sz); ++ i)
        ans += sign[i] * (bound / prod[i]);
    return ans;
}

int main()
{
    ifstream cin("frac.in");
    ofstream cout("frac.out");

    lint N, P;
    cin >> N >> P;

    lint _N = N;
    for (int i = 2; 1LL * i * i <= _N; ++ i)
        if (_N % i == 0) {
            primes[sz ++] = i;
            while (_N % i == 0)
                _N /= i;
        }
    if (_N > 1)
        primes[sz ++] = _N;

    prec();

    lint st = 1;
    lint dr = (1LL << 61);
    lint ans = dr + 1;

    while (st <= dr) {
        lint mid = (st + dr) >> 1;

        if (doCount(mid) >= P) {
            ans = mid;
            dr = mid - 1;
        }
        else
            st = mid + 1;
    }

    cout << ans << '\n';
    return 0;
}