睡前数学一小时之线性筛素数:

睡前数学一小时之线性筛素数:
1,朴素的筛素数算法:埃拉托斯特尼筛法。
这是个简单再简单不过的一个素数的筛法。只是名字很拉风。这就告诉我们,往往东西不好这没什么,名字很拉风。别人也不会记住。hhhhh。
这个的思路就是。每一个数都是由一个质数与和数(质数也可以)的积组成。这也是质数与和数的定义。而这个它这个筛发,就是当遇到一个质数的时候开始枚举,枚举[1,n]中间关于这个质数的倍数。每次都枚举,每次都将算出的这个数打上标记。而最后整个区间内的质数枚举完后,整个区间内的质数也就筛选出来了。
这个很简单。
时间复杂度是O(N logN logN).本人觉得其实在区间100000000之间,这个算法都不会炸。但是不是很推荐这个,1,有点慢,一个数会被筛好几次。2,一点都不装B。。不过。存在必有其道理。这个也有它的用处。

 1 #include<cstdio>
 2 int p[100010],f[100010];
 3 int main()
 4 {
 5     int n,cnt=0;
 6     scanf("%d",&n);
 7     for(int i=2;i<=n;i++)
 8     {
 9     if(f[i]==0)
10     {
11         p[++cnt]=i;
12         for(int j=2;i*j<=n;j++)
13         {
14         f[i*j]=1;
15         }
16     }
17     }
18     for(int i=2;i<=n;i++)
19     {
20     if(f[i]==0)printf("%d ",i);
21     }
22     return 0;
23 }

2,欧拉线性筛法:一个很♀快的筛法,这个求什么函数也是很厉害。很可惜,不会。
而这个筛法的思路就有点绕了。就将一个和数拆成一个最小质因子乘,和数或者是质数。认真思考一下。这样的话。如果保证是最小的质因子。那每个数也就只筛一遍。不用重复筛选。诶!这个不就快起来了。/
这个时间复杂度就只有O(N)明显要比那个埃拉托斯特尼筛法快。但是这个筛法还有其它的用处。所以这个得去了解。
嗯。接下来是代码。

 1 #include<cstdio>
 2 int p[100010],f[100010];
 3 void Euler()
 4 {
 5     int n,cnt=0;
 6     scanf("%d",&n);
 7     for(int i=2;i<=n;++i)
 8     {
 9     if(f[i]==0)
10        p[++cnt]=i;
11     for(int j=1;j<=cnt&&i*p[j]<=n;++j)
12     {
13         f[i*p[j]]=1;
14         if(i%p[j]==0)break;
15     }
16     }
17     return ;
18 }
时间: 2024-10-05 04:48:42

睡前数学一小时之线性筛素数:的相关文章

洛谷 P3383 【模板】线性筛素数

P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行包含一个不小于1且不大于N的整数,即询问概数是否为质数. 输出格式: 输出包含M行,每行为Yes或No,即依次为每一个询问的结果. 输入输出样例 输入样例#1: 100 5 2 3 4 91 97 输出样例#1: Yes Yes No No Yes 说明 时空限制:5

线性筛素数模板

传送门:线性筛素数 Prime: 1 #include<cstdio> 2 3 const int MAXN = 10000100; 4 int Prime[MAXN],n,m,Size; 5 bool Vis[MAXN]={1,1}; 6 7 int main() 8 { 9 scanf("%d%d",&n,&m); 10 for(int i=2;i<n;i++) 11 { 12 if(!Vis[i]) 13 Prime[++Size]=i; 14

leetcode 204. Count Primes(线性筛素数)

Description: Count the number of prime numbers less than a non-negative number, n. 题解:就是线性筛素数的模板题. class Solution { public: int countPrimes(int n) { int ans=0; vector<int>is_prime(n+1,1); for(int i=2;i<n;i++){ if(is_prime[i]){ ans++; for(int j=2*

【算法学习】线性筛素数

声明:本文所涉及部分内容可能并非原创.如发现本文侵犯了您的权益,可申请博主删除. 嘛……好久没有写博客了,今天无聊来写一篇~ 为什么要写这个呢?因为这个算法让我知道了我什么都不会啊…… 闲话少说,切入正题. 1. 筛素数 素数即质数,定义就不说啦 那么我们经典的筛素数的方法呢都很简单,开一个bool数组,从1到$\sqrt n$,如果是素数就把这个数的倍数给筛掉. 时间复杂度显然:$O(nlog_n)$ 代码也很简单: void prime(int n) { for(int i = 2; i *

线性筛素数(欧拉筛)

线性筛素数(欧拉筛) 欧拉筛为啥是\(O(n)\)的呢?我们先来看看代码. #include <cstdio> using namespace std; const int maxn=10000000; int n, m, prime[maxn], isnt_prime[maxn], tot; void get_prime(int n){ isnt_prime[0]=isnt_prime[1]=1; for (int i=2; i<=n; ++i){ //当前数是所有数小于n的数而不只是

线性筛素数(欧拉筛)+前缀和优化

关于素数的定义:在大于1的自然数中,除了1和它本身以外不再有其他因数. 判断一个数是否是素数: 1 int x; // 要求的数 2 for(int i=2;i<=sqrt(x);++i) 3 { 4 if(x%i==0) 5 { 6 cout << "这不是素数" << endl; 7 break; 8 } 9 } 埃氏筛法(时间复杂度:$O(NloglogN)$): 1 int num_prime = 0; // 素数的数量 2 int prime[5

线性筛素数详细整理

如果你在1个月前让我判断素数,我一定会猛敲出以下代码: bool check( int num ) { int tmp =sqrt( num); for(int i= 2;i <=tmp; i++) if(num %i== 0) return 0 ; return 1 ; //实在是太慢了! } $ $ 下面给大家带来3种筛选素数和一种直接判断素数 $ $ $ $ 什么是线性筛? 对于求多个质数时与其一个个判断不如用排除法,用空间换取大量时间. $ $ $ $ $ $ 一般筛法(埃拉托斯特尼筛法

P3383 【模板】线性筛素数

题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行包含一个不小于1且不大于N的整数,即询问概数是否为质数. 输出格式: 输出包含M行,每行为Yes或No,即依次为每一个询问的结果. 输入输出样例 输入样例#1: 100 5 2 3 4 91 97 输出样例#1: Yes Yes No No Yes 说明 时空限制:500ms 128M 数据规模:

单纯的线性筛素数

很多地方要用到素数,而能很快的写出代码筛出素数是很不错的我就单独写一个线性筛的代码和证明. #include<iostream> #incldue<cstdio> #include<queue> #include<algorihtm> #include<cstding> using namespace std; #define N 1000009 bool mark[N];//标记合数, int prime[90000];//储存质数 void