Cod sursa(job #2737153)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 4 aprilie 2021 14:40:30
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("frac.in");
ofstream fout("frac.out");

typedef long long ll;
vector<ll> fac;

ll xCount(ll val)
{
    ll rez = 0;
    for(int msk = 0; msk < (1LL << (int)fac.size()); ++msk){
        ll vv = 1;
        for(int i = 0; i < (int)fac.size() && vv <= val; ++i)
            if((1LL << i) & msk)
                vv *= fac[i];
        if(__builtin_popcount(msk) % 2 == 1)
            rez -= val / vv;
        else rez += val / vv;
    }
    return rez;
}

int main()
{
    ll n, p;
    fin >> n >> p;

    ll d = 2;
    ll cp = n;
    while(d * d <= cp)
    {
        int exp = 0;
        while(cp % d == 0)
        {
            cp /= d;
            ++exp;
        }
        if(exp)
            fac.push_back(d);
        ++d;
    }
    if(cp > 1)
        fac.push_back(cp);

    ll st = 1;
    ll dr = LLONG_MAX - 2;
    ll best = 0;
    while(st <= dr)
    {
        ll mij = (st + dr) / 2;
        ll nr = xCount(mij);
        if(nr >= p){
            best = mij;
            dr = mij - 1;
        }
        else st = mij + 1;
    }
    fout << best << '\n';
    return 0;
}