Cod sursa(job #3142879)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 25 iulie 2023 11:32:43
Problema Frac Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <vector>
#define ll long long
using namespace std;

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

const int VALMAX = 2e6;

int n;
ll P;
bool c[VALMAX + 1];
vector<ll> prime, factori;

void Eratostene()
{
    c[0] = c[1] = 1;
    for(int i = 2; i * i <= VALMAX; i++)
        if(!c[i])
            for(int j = 2; i * j <= VALMAX; j++)
                c[i * j] = 1;
    for(int i = 2; i <= VALMAX; i++)
        if(!c[i])
            prime.push_back(i);
}

void Desc(int n)
{
    ll ind = 0, d = prime[ind];
    while(n > 1)
    {
        if(n % d == 0)
        {
            factori.push_back(d);
            while(n % d == 0)
                n /= d;
        }
        d = prime[++ind];
        if(d * d > n)
            d = n;
    }
}

ll Count(ll n)
{
    ll ans = 0;
    for(int i = 1; i < (1 << factori.size()); i++)
    {
        int lungime = 0;
        ll prod = 1;
        for(int j = 0; j < factori.size(); j++)
            if((i >> j) & 1)
                lungime++, prod *= factori[j];
        if(lungime % 2 == 1)
            ans += n / prod;
        else
            ans -= n / prod;
    }
    return n - ans;
}

int main()
{
    Eratostene();
    cin >> n >> P;

    Desc(n);

    ll st = 1, dr = (1LL << 61), ans = 0;
    while(st <= dr)
    {
        ll mij = (st + dr) / 2;
        if(Count(mij) >= P)
            ans = mij, dr = mij - 1;
        else
            st = mij + 1;
    }
    cout << ans;

    return 0;
}