Cod sursa(job #2135508)

Utilizator tanasaradutanasaradu tanasaradu Data 18 februarie 2018 21:50:04
Problema Frac Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("frac.in");
ofstream fout ("frac.out");
const short Valmax = 12;
int k, st[Valmax], cnt;
long long n, p, prim[Valmax];
vector < int > L[1 << Valmax];
inline void Desc()
{
    long long d = 2;
    if(n % d == 0)
    {
        ++k;
        prim[k] = d;
        while(n % d == 0)
            n /= d;
    }
    d++;
    while(n > 1 && 1LL * d * d <= n)
    {
        if(n % d == 0)
        {
            prim[++k] = d;
            while(n % d == 0)
                n /= d;
        }
        d += 2;
    }
    if(n > 1)
        prim[++k] = d;

}
void Back(int top)
{
    if(top == (k + 1))
    {
        ++cnt;
        for(int i = 1 ; i <= k ; i++)
            L[cnt] . push_back(st[i]);
    }
    else for(int i = 0 ; i <= 1 ; i++)
        {
            st[top] = i;
            Back(top + 1);
        }
}
inline long long CHECK(long long mij)
{
    int ind, nr;
    long long s , sol = 0;
    for(int i = 2 ; i <= cnt ; i++)
    {
        ind = 1;
        nr = 0;
        s = 1;
        for(auto j : L[i])
        {
            if(j == 1)
            {
                ++nr;
                s = 1LL * s * prim[ind];
            }
            ind++;
        }
        if(nr % 2 == 1)
            sol += (mij / s);
        else sol -= (mij / s);
    }
    sol = mij - sol;
    return sol;
}
inline void Binary_Search()
{
    long long stg = 1, drp = (1LL << 61), mij , poz;
    while(stg <= drp)
    {
        mij = (stg + drp) / 2;
        if(CHECK(mij) >= p)
        {
           poz = mij;
           drp = mij - 1;
        }
        else stg = mij + 1;
    }
    fout << poz << "\n";

}
int main()
{
    fin >> n >> p;
    Desc();
    Back(1);
    Binary_Search();
    fin.close();
    fout.close();
    return 0;
}