Eratosthenes筛法
Eratosthenes筛法是一种素数筛,时间复杂度nlogn。
主要思想就是,对于小于n的素数p,删除2p,3p,4p……
筛法的代码可以写成:
memset(vis,0,sizeof(vis));
for(int i=2;i<=M;i++) for(int j=i*2;j<=n;j+=i) vis[j] = 1;
虽然这样已经很快了,但是还是可以进一步优化。
int M = sqrt(n+0.5)
memset(vis,0,sizeof(vis));
for(int i=2;i<=M;i++) if(!vis[i])for(int j=i*i;j<=n;j+=i) vis[j] = 1;
内层循环不用每次从i*2开始,小于i的在之前就已经筛掉了,所以只要从i*i开始就可以,所以第一层循环也就不必循环到n,只要循环到根号n就可以。
代码很简单,在此想引入一下素数定理:,素数定理可以用于预处理时,开数组的大小。
其中Π(x)表示不超过x的素数的个数,就是它和x/lnx比较接近。
筛法很简单,只要是如何利用这个筛法的思路去解题。
紫书上面有一道题是这样的:
无平方因子数
给出正整数n和m,区间的[n,m]内的“无平方因子”的数有多少个?
无平方因字数是指,对于数p,不存在任意k>1,使得p是k^2的倍数,那么p是无平方因字数。
这道题就可以用埃式筛法的思想来解:对于不超过根号m的所有素数p筛掉区间[n,m]内p^2的所有倍数。
代码也十分类似:
int M = sqrt(n+0.5)
memset(vis,0,sizeof(vis));
for(int i=2;i<=M;i++) if(!vis[i])for(int j=i*i*i;j<=n;j+=i*i) vis[j] = 1;
下面这道题是牛客网的一道题。
题目链接:https://www.nowcoder.com/acm/contest/71/A
链接:https://ac.nowcoder.com/acm/contest/71/A?&headNav=www
来源:牛客网
题目描述
给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数
输入描述:
第一行输入一个n接下来一行输入n个正整数ai
输出描述:
输出符合条件个数示例1
输入
5 1 2 3 4 5输出
2说明
5个数中1和2符合条件,1是后面每个数的因子,2是4的因子备注:
1≤n,ai≤1000000
同样是埃式筛法的思想,对于这n个数中的每一个数p找到所有p的倍数,记录个数。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;const int N=1e6+5;
int b[N],a[N],sum;
int main()
{int n;cin>>n;for(int i=0; i<n; i++)cin>>a[i],b[a[i]]=1;for(int i=0; i<n; i++){if(a[i]==1){sum++;continue;}for(int j=a[i]+a[i]; j<N; j+=a[i])if(b[j]==1){sum++;break;}}printf("%d\n",sum);system("pause");return 0;
}
Eratosthenes筛法相关推荐
- Eratosthenes筛法求1-100之间的素数
/* 写出不超过100的所有的素数. 解 将不超过100的正整数排列如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- 素数(质数)判断、打印素数表(Eratosthenes筛法)、质因子分解————附完整代码
文章目录 1 概念 2 素数的判断 2.1 思想 2.2 实现代码 3 素数表的获取 3.1 朴素算法 3.1.1 思想 3.1.2 3 实现代码 3.2 Eratosthenes筛法 3.2.1 思 ...
- Eratosthenes,筛法求素数
//筛法求区间[0,n]的所有素数,v为素数表 //v[i]==0,i为素数 void f(int n) {int m=sqrt(n+0.5);memset(v,0,sizeof(v));for (i ...
- Eratosthenes筛法求素数
问题: 求正整数N以内的全部素数. 思路: 1.从最小的素数x开始(x称作筛数),将所有N以内的x的倍数删除. 2.接着x为下一个素数,在此将其倍数删除. 3.重复以上操作,剩下的就是素数. 注意: ...
- 厄拉托塞师(Eratosthenes)筛法
Eratosthenes筛法 素数的定义 质数又称素数.一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数:否则称为合数. 素数是不能继续分解的整数,同样也是关于乘法运算的最小整数 ...
- 筛法(Sieve of Eratosthenes)
Sieve of Eratosthenes 筛法 百度百科 在数学中,Eratosthenes 筛法是一种古老的算法,用于查找任何给定限制内的所有素数. package mainimport &quo ...
- c语言素数筛法与分解素因数,质因数分解及代码:
计算方法 短除法 求一个数分解质因数,要从最小的质数除起,一直除到结果为质数为止.分解质因数的算式的叫短除法,和除法的性质差不多,还可以用来求多个个数的公因式: 求最大公因数的一种方法,也可用来求最小 ...
- java 埃氏筛法_筛法
素数与最大公因子2021-02-12 17:32:04 素数 定义: 素数是大于 \(1\) 的正整数, 并且除了 \(1\) 和它本身外不能被其他正整数整除. 素数的数量: 不超过 \(N\) 的素 ...
- 线性筛法求素数c语言,[算法]素数筛法(埃氏筛法线性筛法)
一.素数筛的定义 给定一个整数n,求出[1,n]之间的所有质数(素数),这样的问题为素数筛(素数的筛选问题). 二.埃氏筛法(Eratosthenes筛法) 埃氏筛法又叫做Eratosthenes筛法 ...
- Java求n以内素数_求0到n之间素数个数的序列(Java)
要求: (1) 找出0-1000之间素数 (2) 设f(n)表示0-n之间的素数个数,计算出当n=0,1,2,3,.....,997时f(n)的值,并写入文件 分析: 首先找素数使用一个效率较高的方法 ...
最新文章
- 低配版AI车神?网友用单个CNN在「极品飞车9」里飙车
- Hermes实时检索分析平台
- Shiro SpringMVC 非maven HelloWorld
- 分析及解决SQLServer的死锁问题
- 百度2019暑期实习计算机视觉岗位笔试题
- 《FPGA入门教程》看书随笔——RTL设计
- Java 8将默认使用传输级别安全性(TLS)1.2
- C#使用Dotfuscator混淆代码以及加密
- python中空位符_python中空位符_Python之路 - Python - 字符编码 - 期权论坛
- IO流 (一) ----- 基本概念和FIle类
- WebDriver API学习记录
- iOS开发之开发者账号的申请进度跟进(申请的询问)
- uni-app 获取屏幕亮度与设置屏幕亮度
- Web报表系统葡萄城报表:报表设计
- excel表格,如何按编号换行
- python目前的最新版本是_最新版Python 3.8.6 版本发布
- linux实现虚拟专用网
- Java工作4年来应聘要16K最后没要,细节如下。。。
- 新版kettle学习
- 静态成员函数访问非静态成员