Cod sursa(job #3166723)

Utilizator RobertAcAcatrinei Robert-Marian RobertAc Data 9 noiembrie 2023 13:50:21
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>
#ifdef LOCAL
#define in cin
#define out cout
#endif
#define int int64_t
using namespace std;

#ifndef LOCAL
ifstream in("frac.in");
ofstream out("frac.out");
#endif

const int nmax = 2e5;

vector<int> primes;
int ciur[nmax];

void doCiur()
{
    primes.push_back(2);
    for(int i=3;i<nmax;i+=2)
    {
        if(!ciur[i])
        {
            primes.push_back(i);
            for(int j=i*i;j<nmax;j+=i)
            {
                ciur[j]=1;
            }
        }
    }
}

vector<int> getDivs(int nr)
{
    vector<int> res;
    for(auto i:primes)
    {
        if(nr%i==0)
        {
            res.push_back(i);
        }
    }
    for(auto i:primes)
    {
        while(nr%i==0)
        {
            nr/=i;
        }
    }
    if(nr!=1)res.push_back(nr);
    return res;
}

int total;

int nrOfNrs(int nr)
{
    return total/nr;
}

void bkt(vector<int> &v,int &res,int ind=0,int sign=1,int prod=1)
{
    if(v.size()==ind)
    {
        res+=sign*nrOfNrs(prod);
    }
    else
    {
        bkt(v,res,ind+1,sign,prod);
        bkt(v,res,ind+1,sign*-1,prod*v[ind]);
    }
}

signed main()
{
    doCiur();
    int n,p;in>>n>>p;
    auto v=getDivs(n);
    int st=1,dr=__LONG_LONG_MAX__/2;
    while(st<dr)
    {
        total=(st+dr)/2;
        int res=0;
        bkt(v,res);
        if(res<p)
        {
            st=total+1;
        }
        else
        {
            dr=total;
        }
    }
    out<<st;
}