Cod sursa(job #3143745)

Utilizator matwudemagogul matwu Data 1 august 2023 21:46:50
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("frac.in");
ofstream fout("frac.out");
#define cin fin
#define cout fout


long long calc(long long a, long long b){
    vector<int> prime;
    long long ans = 0;
    int d = 2, p = 1;
    while(b > 1){
        p = 0;
        while(b && b % d == 0){
            b /= d;
            p++;
        }
        if(p){
            prime.push_back(d);
        }
        d++;
        if(d *d > b && b > 1){
            d = b;
        }
    }
        
    int s = prime.size();
    for(int mask = 1; mask < (1 << s); mask++){
        long long sm = 1;
        for(int i = 0; i < s; i++){
            if(mask & (1 << i)){
                sm = 1ULL * sm * prime[i];
            }
        }
        if(sm <= a){
            if(__builtin_popcount(mask) % 2 == 0){
                ans -= (a / sm);
            }else{
                ans += (a / sm);
            }
        }
    }
    return a - ans;
}
long long n, p;
int main(){
    //cin.tie(0)->sync_with_stdio(0);
    cin >> n >> p;
    long long st = 1, dr = 1e18;
    while(st <= dr){
        long long tm = (st + dr) / 2;
        long long nr = calc(tm, n);
        if(nr < p){
            st = tm + 1;
        }else{
            dr = tm - 1;
        }
    }

    cout << st << " " << '\n';
}