Cod sursa(job #3224843)

Utilizator TeodoraMaria123Serban Teodora Maria TeodoraMaria123 Data 16 aprilie 2024 12:45:13
Problema Frac Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>

using namespace std;

long long n, p;
vector <long long> v;

long long ok(int x)
{
    long long ans = 0;
    long long configNo = (1ll << v.size()) - 1;
    for(long long mask = 1; mask <= configNo; mask ++)
    {
        bool ok = 1;
        int bits = 0;
        long long div = 1;
        for(int i = 0; i < v.size() &&  ok; i ++)
        {
            if((1ll << i) &  mask)
            {
                bits++;
                div *= v[i];
                if(div >= x)
                    ok = 0;
            }
        }
        if(bits % 2)
            ans += x / div;
        else
            ans -= x / div;
    }
    return ans;
}

long long bs()
{
    long long st = 1, dr = 1e18, med, last = -1;
    while(st <= dr)
    {
        med = (st + dr) / 2;
        if(med - ok(med) >= p)
        {
            dr = med - 1;
            last = med;
        }
        else
            st = med + 1;
    }
    return last;
}

int main()
{
    ios_base :: sync_with_stdio(0);
    cin.tie(0);

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

    cin >> n >> p;

    long long d = 2;

    while(d * d <= n)
    {
        int ok = 0;
        while(n % d == 0)
        {
            n /= d;
            ok = 1;
        }
        if(ok == 1)
            v.push_back(d);
        d ++;
    }
    if(n != 1)
        v.push_back(n);

    cout << bs();
    return 0;
}