【问题标题】:Segmented Sieve of Erastothenes C++ SPOJ [duplicate]Eratosthenes C ++ SPOJ的分段筛[重复]
【发布时间】:2014-07-20 04:43:24
【问题描述】:

我知道以前有人问过这个问题,但我不能完全理解如何实现 Eratosthenes 的分段筛。

问题

输入以单行中的测试用例数量 t (t

我的方法

我可以实现埃拉托色尼筛法,我可以找到最大为 n 的平方根的素数。 但我无法理解如何实施其他网站上正在讨论的“偏移”。如何在选定的分区上执行 Sieve?

#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    int t;
    cin>>t;

    while(t--)
    {
        long long m,n;
        long long p[100001];
        bool primes[100000];

        cin>>m;
        cin>>n;
        long long square=sqrt(n);
        cout<<square;
        int j=0;
        int i;
        primes[0]=false;    
        primes[1]=false;

        for(i=2; i<n;i++)
            primes[i]=true;

        for(i=2; i<=square; i++)
        {
            if(primes[i]==true)
            {
                for(j=i+i; j<=n; j+=i)
                    primes[j]=false;
            }
        }

        for(i=m; i<n ; i++)
        {
            if(primes[i]==true)
            {
                cout<<i<<" \t";
                if(i >= m)
                {
                    p[j]=i;
                    j++;
                }
            }
        }

        for(i=0 ; i<j ; i++)
        {
            cout<<p[i]<<"\n";
        }
    }

    return 0;
}

【问题讨论】:

  • 从不同于 1 的数字开始?还要学会正确地格式化你的代码。
  • 看我的回答here

标签: c++ primes sieve-of-eratosthenes


【解决方案1】:

考虑一个段 S:[a,b] 和一个素数 p。

请注意,以下代码将消除所有“对应”于素数 p 的复合材料。

for(int i=ceil(a/p);i<=floor(b/p);++i) {
    new_primes[i*p-a]=false;

将此想法扩展到所有素数sqrt(b)。

【讨论】:

    【解决方案2】:

    首先,既然您提到您正在为 SPOJ 编码,我会告诉您这行不通。即使您以某种方式获得了一种仅从 m 到 n 进行 SOE 的方法,您也会执行这样的 seives t 次,这将给您 TLE。

    预期的是在整个范围内对 SOE 进行简单的预计算,即从 1 到 10^x。首先在您的 while 循环之外执行 SOE 并将所有素数存储到一个向量中。然后在您的 while 循环中简单地显示向量中所需的素数。

    【讨论】:

    • 我使用布尔数组 primes 进行筛选,使用向量 prime 存储/预计算素数'for(i=m; i=m && prime[i]n)中断; } //' 我试过了,但是没有用。如何实际实现这一点? (它适用于高达 10^5 且不适用于较大的 m 和 n 值)
    • 在 while 循环外将所有素数推回向量中。在您的 while 循环中,只需遍历您的向量,直到找到 prime>m 并打印,直到找到 prime >n 。可能它只为您工作到 10^5,因为您在某处使用 int,在任何地方都使用 long long int 应该没问题。需要注意的一点是,有时您的计算机的编译器不允许您为筛子创建大小为 1000000000 的 bool 数组,但 spoj 会允许您,我以前做过,我刚才也在 ideone 上测试过,创建如此大的数组是允许的。 ideone.com/qX2LNP
    • 我遇到了运行时错误。不适用于大数字...ideone.com/cAhNWh
    猜你喜欢
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多