Cod sursa(job #2330457)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 28 ianuarie 2019 13:51:02
Problema Frac Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.47 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N=(int)1e6+1233;

class slover
{
        private :
                ll vll;
                ll koko;
                bool prie[N];
                vector<ll>p;
                vector<ll>divi;
                ll res;
                void go(int strat,int sgn,ll prod)
                {
                        if(strat==divi.size())
                        {
                                res+=sgn*(vll/prod);
                        }
                        else
                        {
                                go(strat+1,sgn,prod);
                                go(strat+1,-sgn,prod*p[strat]);
                        }
                }
        public :
                void build()
                {
                        p.clear();
                        for(int i=2;i<N;i++)
                        {
                                prie[i]=1;
                        }
                        for(int i=4;i<N;i+=2)
                        {
                                prie[i]=0;
                        }
                        for(int i=3;i*i<N;i+=2)
                        {
                                if(prie[i])
                                {
                                        for(int j=i*i;j<N;j+=2*i)
                                        {
                                                prie[j]=0;
                                        }
                                }
                        }
                        for(int i=1;i<N;i++)
                        {
                                if(prie[i])
                                {
                                        p.push_back(i);
                                }
                        }
                }
                ll slove(ll n,ll k)
                {
                        vll=n;
                        divi.clear();
                        for(int i=0;p[i]*p[i]<=n;i++)
                        {
                                bool krr=0;
                                while(n%p[i]==0)
                                {
                                        krr=1;
                                        n/=p[i];
                                }
                                if(krr)
                                {
                                        divi.push_back(p[i]);
                                }
                        }
                        if(n>1)
                        {
                                divi.push_back(n);
                        }
                        res=0LL;
                        go(0,1,1);
                        ll r=0,pas=(1LL<<60);
                        while(pas)
                        {
                                vll=r+pas;
                                res=0LL;
                                go(0,1,1);
                                if(res<k)
                                {
                                        r+=pas;
                                }
                                pas/=2;
                        }
                        r++;
                        return r;
                }
};

int main()
{
        freopen("frac.in","r",stdin);
        freopen("frac.out","w",stdout);
        slover kek;
        kek.build();
        ll a,b;
        cin>>a>>b;
        cout<<kek.slove(a,b)<<"\n";
        return 0;
}