RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 902045
Accepted
Philippe
Philippe
Asked:2020-11-04 16:24:32 +0000 UTC2020-11-04 16:24:32 +0000 UTC 2020-11-04 16:24:32 +0000 UTC

查找范围 [A; 中的所有素数;乙]

  • 772

一个任务:

找到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; 乙]。

问题:

该解决方案不适用于某些测试(即解决方案不完整)。不幸的是,测试是未知的。

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Philippe
    2020-11-04T23:22:03Z2020-11-04T23:22:03Z

    我开始对大量数字进行测试,并注意到经常遇到 1-2 个困难的数字。我不知道为什么,但是更改j = i * i为j = 2 * i修复了所有内容,并且该程序没有运行超过 40 毫秒。

    完整解决方案代码:

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    typedef long long ll;
    
    const ll MAXN = 1e6 + 1;
    ll max(ll a, ll b) {
        return a > b ? a : b;
    }
    
    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 mmax = MAXN - 1;
        for (ll i = 2; i <= mmax; ++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 > i)
                    ans[i + r] = false;
                for (ll j = 2 * i; j <= mmax; 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 << ' ';
        }
    }
    
    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5