Cod sursa(job #1897751)

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

using namespace std;

typedef long long int lint;

int sz;
int primes[20];

lint doCount(lint bound) {
    lint ans = 0;
    for (int i = 0; i < (1 << sz); ++ i) {
        lint prod = 1;
        int sign = 1;
        for (int j = 0; j < sz; ++ j)
            if (i & (1 << j))
                prod *= primes[j], sign *= (-1);
        ans += sign * (bound / prod);
    }

    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;

    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;
}