Cod sursa(job #1456657)

Utilizator cojocarugabiReality cojocarugabi Data 1 iulie 2015 16:16:44
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
# include <bits/stdc++.h>
# define ll long long
using namespace std;
ifstream fi("frac.in");
ofstream fo("frac.out");
const int nmax = 1e6 + 55;
bitset < nmax > b;
vector < int > prim;
vector < int > fact;
int k;
ll ans(ll a,ll n)
{
    int d = -1;
    fact.clear();
    while (n > 1)
    {
        ++d;
        if (!(n%prim[d]))
        {
            fact.push_back(prim[d]);
            while (!(n%prim[d])) n /= prim[d];
        }
        if (prim[d] > sqrt(n) && n != 1)
        {
            fact.push_back(n);n = 1;
        }
    }
    k = fact.size();
    int l = 1 << k;
    ll sol = 0;
    for (ll p = 1;p < l;++p)
    {
        ll nr = 0;
        ll pr = 1;
        for (int i = 0;i < k;++i) if ((1LL << i)&p) ++nr,pr *= fact[i];
        if (nr&1) nr = 1;else nr = -1;
        sol += a / (pr*nr);
    }
    return a - sol;
}
int main(void)
{
    ll x,y;
    for (int i = 3;i <= 1e6;i += 2) b[i] = 1;
    prim.push_back(2);
    for (int i = 3;i <= 1e3;i += 2)
        if (b[i])
        {
            prim.push_back(i);
            for (int j = i*i;j <= 1e6;j += i) b[j] = 0;
        }
    for (int i = 1e3+1;i <= 1e6;++i) if (b[i]) prim.push_back(i);
    fi>>x>>y;
    ll p = 1,u = 1LL << 61;
    ll bst = 1LL << 61;
    while (p <= u)
    {
        ll m = (p + u) / 2;
        if (ans(m,x) < y) p = m + 1;
        else bst = min(bst,m),u = m - 1;
    }
    return fo << bst << '\n',0;
}