Cod sursa(job #2855355)

Utilizator Darius_CDarius Chitu Darius_C Data 22 februarie 2022 13:01:31
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <vector>
std::ifstream fin("frac.in");
std::ofstream fout("frac.out");
using namespace std;
typedef long long ll;

ll N,P;
ll K;
vector<int> vp;
ll rez;

void FindPrimes(ll x)
{
	ll d,exp;
	for(d=2,exp=0;x%d==0;x/=d,exp++);
	if(exp)
        vp.push_back(d);
    for(d=3;d*d<=x;d+=2)
    {
        for(exp=0;x%d==0;x/=d,exp++);
        if(exp)
            vp.push_back(d);
    }
    if(x>1)
        vp.push_back(x);
}

ll Inclusion_Exlusion(ll LIM)
{
    ll ret=0;
    for(ll bitmask=1;bitmask<(1<<K);bitmask++)
    {
        ll prod=1,cnt=0;
        for(ll i=0;i<K;i++)
            if((bitmask & (1<<i))!=0)
            {
                prod*=vp[i];
                cnt++;
            }
        if(cnt%2!=0)
            ret+=LIM/prod;
        else
            ret-=LIM/prod;
    }
    return LIM-ret;
}

ll BinarySearch()
{
    ll st=1, dr=8223372036854775807;
    ll ans=0;
    while(st<=dr)
    {
        ll mij=(st+dr)/2;
        ll pozitie=Inclusion_Exlusion(mij);
        if(pozitie>=P)
        {
            if(pozitie==P)
                ans=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    return ans;
}

int main()
{
    fin>>N>>P;
    FindPrimes(N);
    K=vp.size();
    rez=BinarySearch();
    fout<<rez;
    return 0;
}