Поиск всех простых чисел на отрезке [l, r]
t, d = map(int, input().split())
l, r = max(t - d, 1), t + d
n = int(r ** 0.5) + 2
F = [True] * (n + 1)
F[0] = F[1] = False
for i in range(2, n):
if F[i]:
for j in range(i * i, n, i):
F[j] = False
P = [i for i, f in enumerate(F) if f]
n = r - l + 1
F = [True] * n
for p in P:
if p * p > r:
break
s = max(p * p, ((l + p - 1) // p) * p)
for j in range(s, r + 1, p):
F[j - l] = False
res = []
for i in range(n):
if F[i] and (i + l) >= 2:
res.append(i + l)
print(*res)
#include <bits/stdc++.h>
using namespace std;
int main() {
int t, d;
cin >> t >> d;
int l = max(t - d, 1), r = t + d;
int n = sqrt(r) + 2;
vector<bool> F(n + 1, true);
F[0] = F[1] = false;
for (int i = 2; i < n; i++) {
if (F[i]) {
for (int j = i * i; j < n; j += i) {
F[j] = false;
}
}
}
vector<int> primes;
for (int i = 2; i < n; i++) {
if (F[i]) primes.push_back(i);
}
int len = r - l + 1;
vector<bool> isPrime(len, true);
for (int p : primes) {
if (p * p > r) break;
int start = max(p * p, ((l + p - 1) / p) * p);
for (int j = start; j <= r; j += p) {
isPrime[j - l] = false;
}
}
for (int i = 0; i < len; i++) {
if (isPrime[i] && (i + l) >= 2) {
cout << i + l << " ";
}
}
return 0;
}
Если нужно найти простые числа на отрезке [l, r], где r может быть большим (например, 10¹²), а разность (r-l) относительно невелика, используется алгоритм решета на отрезке.
Временная сложность: O(√r + (r-l) log log r)
Пространственная сложность: O(r-l)
Ввод: t d — центр отрезка и радиус (отрезок [t-d, t+d])
Вывод: простые числа на отрезке
10 5
Отрезок [5, 15]
Вывод: 5 7 11 13