一个任务:
找到A 和 B 之间的所有素数 ( 1 <= A <= B <= 10^12 ),前提是B - A <= 10 ^ 6。我已经为此挠头了 4 天了。有一个带有Eratosthenes 筛子的C++解决方案。
解决方案:
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const ll MAXN = 1e6 + 1;
int main() {
cin.tie(0); //Ускоряем cin
cout.tie(0); //Ускоряем cout
ll a, b;
cin >> a >> b; //Получаем числа
bool prime[MAXN], ans[MAXN]; //ans[i] - является ли число a + i простым
memset(prime, true, MAXN);
memset(ans, true, MAXN);
prime[0] = prime[1] = false;
//Оба вложенных цикла взяты из кода по ссылку (стандартная реализация решета Эратосфена)
ll n = MAXN - 1;
for (ll i = 2; i <= n; ++i) {
if (prime[i]) {
ll r = a % i;
r = (i - r) % i; //Что нужно прибавить к а, чтобы получить непростое число
if (a + r > i && r < MAXN) //Проверяем на выход из массива. Если убрать условие а + r > i, тогда алгоритм отмечает 2, 3, 5 как не простые
ans[r] = false;
if (i + r < MAXN && a + r + i > 1ll * i)
ans[i + r] = false;
for (ll j = i * i; j <= n; j += i) {
prime[j] = false;
if (a <= j && j - a < MAXN) //Если а < 10 ^ 6 (бех этой проверки не работает)
ans[j - a] = false;
if (j + r < MAXN)
ans[j + r] = false;
}
}
}
//Выводим результат
for (ll i = 0; i <= b - a; ++i) {
if (ans[i] && a + i >= 2)
cout << a + i << ' ';
}
}
解决方案说明:
找到段 [0; 上的所有素数;b - a] 对于O(10^6 log log 10^6),在除法余数的帮助下,我们将这些素数转移到段 [a; 乙]。
问题:
该解决方案不适用于某些测试(即解决方案不完整)。不幸的是,测试是未知的。
我开始对大量数字进行测试,并注意到经常遇到 1-2 个困难的数字。我不知道为什么,但是更改
j = i * i为j = 2 * i修复了所有内容,并且该程序没有运行超过 40 毫秒。完整解决方案代码: