Cod sursa(job #3220012)

Utilizator Radu_MocanasuMocanasu Radu Radu_Mocanasu Data 1 aprilie 2024 23:58:40
Problema Frac Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("frac.in");
ofstream fout("frac.out");
const long long range_max = 1LL << 61;
long long p;
long long fp[15];
int k;
long long calc(long long n){
    long long rez = 0;
    for(int e = 0; e < (1 << k); e++){
        long long t = 1;
        int nrb = 0;
        for(int i = 0; i < k; i++){
            if((1 << i) & e){
                t *= fp[i];
                nrb++;
            }
        }
        if(nrb & 1) rez -= n / t;
        else rez += n / t;
    }
    return rez;
}
int cb(){
    long long st = 1, dr = range_max + 5, med, poz = -1;
    while(st <= dr){
        med = (st + dr) / 2;
        if(calc(med) >= p){
            poz = med;
            dr = med - 1;
        }
        else st = med + 1;
    }
    return poz;
}
int main()
{
    long long n,x,d;
    fin >> n >> p;
    for(d = 2; d * d <= n; d++){
        if(n % d == 0) fp[k++] = d;
        while(n % d == 0) n /= d;
    }
    if(n > 1) fp[k++] = n;
    fout << cb();
    return 0;
}