Cod sursa(job #2837846)

Utilizator loraclorac lorac lorac Data 22 ianuarie 2022 18:20:24
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("frac.in");
ofstream out("frac.out");
typedef long long ll;
vector<ll> primes;
vector<ll> prod;
ll n,p,l,r,med;
int main()
{
    in>>n>>p; l=n;
    for(ll i=2;i*i<=l;++i)
    if(l%i==0)
    {
        primes.push_back(i);
        while(l%i==0) l/=i;
    }
    if(l>1) primes.push_back(l);
    ll nr=primes.size();
    for(ll mask=0;mask<(1LL<<nr);++mask)
    {
        ll app=0,add=1;
        for(ll i=0;i<nr;++i)
        if(mask&(1LL<<i)) ++app,
            add*=primes[i];
        if(app%2==0) prod.push_back(add);
        else prod.push_back(-add);
    }
    l=1,r=(1LL<<61);
    while(l<r)
    {
        ll ans=0;
        med=(l+r)>>1;
        for(ll x:prod)
        if(x>0) ans+=med/x;
        else ans-=med/(-x);
        if(ans==p) r=med;
        else if(ans<p) l=med+1;
        else r=med-1;
    }
    out<<l<<'\n';
    return 0;
}