Cod sursa(job #3305119)

Utilizator lucaje123Vartolomei Luca lucaje123 Data 30 iulie 2025 09:31:02
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <string.h>
using namespace std;

ifstream cin("frac.in");
ofstream cout("frac.out");

long long n, p;
int ciur[1000005];
vector<int> primes;

void precalc(){
    for(int i=2;i<=1000000;i++){
        ciur[i]=true;
    }
    for(int i=2;i<=1000000;i++){
        if(ciur[i]==true){
            for(int j=2*i;j<=1000000;j+=i){
                ciur[j]=false;
            }
            primes.push_back(i);
        }
    }
}

vector<long long> get_fact(long long x){
    vector<long long> ans;
    int d=0;
    while(d<primes.size()&&primes[d]*primes[d]<=x){
        if(x%primes[d]==0){
            ans.push_back(primes[d]);
            while(x%primes[d]==0){
                x=x/primes[d];
            }
        }
        d++;
    }
    if(x>1){
        ans.push_back(x);
    }
    return ans;
}

long long query(long long a, long long b){
    vector<long long> primes=get_fact(b);
    int k=primes.size();
    long long ans=0;
    for(int mask=0;mask<(1<<k);mask++){
        long long p=1;
        int cnt=0;
        for(int j=0;j<k;j++){
            if(mask&(1<<j)){
                p=p*primes[j];
                cnt++;
            }
        }
        if(cnt%2==0){
            ans+=a/p;
        }
        else{
            ans-=a/p;
        }
    }
    return ans;
}

int main(){
    precalc();
    cin>>n>>p;
    long long st=1, dr=(1LL<<61), mij=0, ans=0;
    while(st<=dr){
        mij=(st+dr)/2;
        if(query(mij, n)<p){
            st=mij+1;
        }
        else{
            ans=mij;
            dr=mij-1;
        }
    }
    cout<<ans;
}