代码模板——素数筛法

Posted ignorance

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码模板——素数筛法相关的知识,希望对你有一定的参考价值。

埃氏筛法:从1到n遍历一遍,每找到一个素数就记录下来并把它的倍数全部筛掉。

时间复杂度:O(nlog(log (n)) )

code:

#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <stack>
#define FT(a, b) memset(a, b, sizeof(a))
#define FAT(a) memset(a, 0, sizeof(a))
using namespace std;
typedef long long ll;
const int M = 1e6 + 10;
const int INF = 0x3f3f3f3f;
int n, prime[M], cnt,vis[M];
void get_prime()
{
    for(int i = 2;i<=n;i++)
    {
        if(!vis[i])
        {
            prime[cnt++] = i;
            for(int j = 2;j<=n/i;j++)
            {
                vis[j*i] = 1;
            }
        }
    }
}
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("/home/wjy/code/c++/in.txt", "r", stdin);
#endif
    scanf("%d", &n);
    FAT(vis);
   cnt = 0; get_prime(); printf(
"%d ", cnt); return 0; }

线性(欧拉)筛法: 把1~n内全部合数用最小质因子筛掉。

时间复杂度O(n)

代码:

#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <functional>
#include <map>
#include <set>
#include <stack>
#define FT(a, b) memset(a, b, sizeof(a))
#define FAT(a) memset(a, 0, sizeof(a))
using namespace std;
typedef long long ll;
const int M = 1e6 + 10;
const int INF = 0x3f3f3f3f;
int n, prime[M], cnt, vis[M];
void get_prime()
{
    for (int i = 2; i <= n; i++)
    {
        if (!vis[i])
            prime[cnt++] = i;
        for (int j = 0; prime[j] <= n / i; j++)
        {
            vis[prime[j] * i] = 1;
            if (i % prime[j] == 0)
                break;
        }
    }
}
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("/home/wjy/code/c++/in.txt", "r", stdin);
#endif
    scanf("%d", &n);
    FAT(vis);
    cnt = 0;
    get_prime();
    printf("%d
", cnt);
    return 0;
}

以上是关于代码模板——素数筛法的主要内容,如果未能解决你的问题,请参考以下文章

数学基础素数线性筛法--欧拉筛法模板普通筛法的优化

素数的快速筛法(埃氏筛法模板)

浅谈线性素数筛

模板素数筛法

筛法求素数的几个模板

[模板]线性筛素数(欧拉筛法)