Cod sursa(job #2417386)

Utilizator petrisorvmyVamanu Petru Gabriel petrisorvmy Data 29 aprilie 2019 17:23:07
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
#include <vector>
#define ll long long
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
ll n, p;
vector <ll> v;
void divizori(ll x)
{
    ll d = 2;
    if(x % d == 0)
    {
        while(x % d == 0)
            x /= d;
        v.push_back(d);
    }
    d = 3;
    while(d * d <= x && x > 1)
    {
        if(x % d == 0)
        {
            while(x % d == 0)
                x /= d;
            v.push_back(d);
        }
        d += 2;
    }
    if(x > 1) v.push_back(x);
}
ll pinex(ll x)
{
    ll ans, maxim;
    ans = 0;
    maxim = 1LL << v.size();
    for(ll i = 1; i < maxim; ++i)
    {
         ll prod = 1;
         ll nr = 0;
         for(ll j = 0; j < v.size(); ++j)
            if(i & (1LL << j))
             {
                 nr++;
                 prod *= v[j];
             }
        if(nr % 2 == 1)
            ans += x / prod;
        else ans -= x/ prod;
    }
    return ( x - ans >= p);
}
int main()
{
    f >> n >> p;
    divizori(n);
    ll st = 1, dr = (1LL << 61), last = 1;
    while(st <= dr)
    {
        ll mij = (st + dr)/ 2 ;
        if(pinex(mij))
            dr = mij - 1, last = mij;
        else st = mij + 1;
    }
    g << last;
    f.close(); g.close();
    return 0;
}