Cod sursa(job #3220621)

Utilizator Dani111Gheorghe Daniel Dani111 Data 4 aprilie 2024 13:31:28
Problema Frac Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <bits/stdc++.h>
using namespace std;

const int MAX = 1000;
int dv[MAX + 3], kdv;
long long N, P, X;
long long sum = 0;
//numarul de nr. prime cu N din intervalul 1 -> X

void back(int nr, long long prod, int idx){
    if(nr != 0)
    if(nr % 2 == 1) sum -= (X / prod);
    else sum += (X / prod);
    //cout << sum << ' ' << nr << ' ' << prod << '\n';
    for(int i = idx; i <= kdv; i++) {
        //if(1LL * prod * dv[i] <= X) {
            back(nr + 1, prod * dv[i], i + 1);
        //}
    }
    
}

void pinex(long long x) {
    sum = 0;
    X = x;
    sum = x;
    if(x != 1)
    back(0, 1, 1);
    //cout << sum << ' ';
}   

void divprimi(long long X) {
    int d = 2;
    while(X != 1) {
        int p = 0;
        while(X % d == 0) {
            X /= d;
            p++;
        }
        if(p) {
            kdv++;
            dv[kdv] = d;
        }
        d++;
        if(d * d > X) d = X;
    }
}

int main() {
    freopen("frac.in", "r", stdin);
    freopen("frac.out", "w", stdout);

    cin >> N >> P;
    divprimi(N);
    // for(auto i : dv) {
    //     cout << i << ' ';
    // }
    // for(int i = 1; i <= 15; i++) {
    //     pinex(i);
    // }
    

    long long st = 1, dr = 1e9;
    long long best = 0;
    while(st <= dr) {
        long long mid = (st + dr) / 2;
        pinex(mid);
        //cout << mid << ' ' << sum << '\n';
        if(sum >= P) {
            best = mid;
            dr = mid - 1;
        }
        else {
            st = mid + 1;
        }
    }

   cout << best;


    //pinex(13);
    //cout << sum << ' ';

}

/*

    Problema frac, idee:
    -> Fac o functie care calculeaza folosind pinex cate numere prime cu N
    sunt in intervalul 1 ... X 
    -> Caut binar x-ul pentru care F(x) = P 

    Functia pinex:
    -> Backtracking pe divizori: 
        -> Daca lungimea solutiei e impara, scad la ans, altfel cresc la ans


*/