Pagini recente » Cod sursa (job #2671149) | Cod sursa (job #2621166) | Cod sursa (job #624805) | Cod sursa (job #2648717) | Cod sursa (job #3220621)
#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
*/