Cod sursa(job #2767548)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 6 august 2021 17:45:39
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("frac.in");
ofstream fout("frac.out");

long long n, p;

int main(){
    fin >> n >> p;
    long long st = p, dr = (1LL << 61), ans = 0;
    vector <long long> div;
    for (long long i = 2; i * i <= n; ++i){
        bool ok = false;
        while (n % i == 0){
            n = n / i;
            ok = true;
        }
        if (ok){
            div.push_back(i);
        }
    }
    if (n > 1){
        div.push_back(n);
    }
    while (st <= dr){
        long long mid = (1LL * st + dr) / 2;
        long long cnt = mid;
        for (int stare = 1; stare < (1LL << div.size()); ++stare){
            int b = 0;
            long long val = 1;
            for (int j = 0; j < div.size(); ++j){
                if ((stare >> j) & 1){
                    val = 1LL * val * div[j];
                    ++b;
                }
            }
            if (b % 2 == 1){
                cnt = cnt - mid / val;
            }
            else{
                cnt = cnt + mid / val;
            }
        }
        if (cnt >= p){
            ans = mid;
            dr = mid - 1;
        }
        else{
            st = mid + 1;
        }
    }
    fout << ans;
    fin.close();
    fout.close();
    return 0;
}