线性筛素数和理解 洛谷P3383
题目链接:https://www.luogu.org/problemnew/show/P3383
线性筛法筛素数的特点是每一个数字只被遍历一次,即时间复杂度为O(n),所以说他是线性的,并且所有的非素数都是被它的最小素因子筛去的。
我们先看板子:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<set>
#include<cstdio>
#include<string>
#include<deque>
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 10000005
int prime[maxn];//prime数组存我们筛出来的素数
bool vis[maxn];//在这里面vis[i]辨别i是不是一个素数,假如vis[i]==false,那么i是素数,否则不是
int n,m,k,t,cnt;
void play_table(){
cnt=;//一个计数器,记录素数的个数
memset(vis,false,sizeof(vis));
vis[]=vis[]=true;//0和1提前赋值为true
for(int i=;i<maxn;i++){
if(vis[i]==false){
prime[cnt++]=i;//记录素数
}
for(int j=;j<cnt&&prime[j]*i<maxn;j++){
vis[prime[j]*i]=true;
if(i%prime[j]==)
break;
}
}
}
int main()
{
play_table();
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=;i<m;i++){
scanf("%d",&k);
if(vis[k]==false)
printf("Yes\n");
else
printf("No\n");
}
}
return ;
}
我们看里面关键的一部分:
for(int j=;j<cnt&&prime[j]*i<maxn;j++){
vis[prime[j]*i]=true;
if(i%prime[j]==)
break;
}
假设现在我们有一个i,我们执行上面部分的代码:
for循环里面除了j<cnt外还要加上&&prime[j]*i<maxn,防止数组越界。
我们知道2它是最小的素数,那么2*(任何数字)得出的都是一个非素数,并且这个非素数一定是被它的最小素因子2给筛掉的,这里面的prime[0]一定是2,所以我们先执行vis[prime[j]*i]=true,先把2*i标记为非素数。
接下来一句
if(i%prime[j]==)
break;
假如 i 被prime[j]整除,那么我们就跳出循环。
首先假如 i 被prime[j]整除,那么 i 一定有一个素因子是prime[j],i 一定是一个合数;
因为我们筛出来的素数是从小到大的,所以prime[j+1]>prime[j]是成立的,假如我们现在不跳出,那么我们接下来肯定会有vis[i*prime[j+1]]=true,这样的话,prime[j+1]*i这个非素数就是被他的素因子prime[j+1]筛去,但是事实上 i 这个数字是一个合数,它是可以分解的,假设i=prime[j]*d,在后面肯定还会有i=prime[j+1]*d,vis[i*prime[j]]=true 再把这个非素数筛一次,这样我们就不符合非素数被它的最小素因子筛去并且每一个数字只遍历一次的原则了。
所以我们在这里面要跳出,等i==prine[j+1]*d时,我们这个时候vis[i*prime[j]]=true,用prime[j]这个最小素因子把prime[j]*prime[j+1]*d这个非素数筛去。
线性筛素数和理解 洛谷P3383的更多相关文章
- 洛谷 P3383 【模板】线性筛素数-线性筛素数(欧拉筛素数)O(n)基础题贴个板子备忘
P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范 ...
- 洛谷P3383 【模板】线性筛素数
P3383 [模板]线性筛素数 256通过 579提交 题目提供者HansBug 标签 难度普及- 提交 讨论 题解 最新讨论 Too many or Too few lines 样例解释有问题 ...
- 洛谷 P3383 【模板】线性筛素数
P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范 ...
- 欧拉函数O(sqrt(n))与欧拉线性筛素数O(n)总结
欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. POJ 2407.Relatives-欧拉函数 代码O(sqrt(n)): ll euler(ll n){ ll ans=n; ...
- ACM-ICPC 2018 南京赛区网络预赛 J题Sum(线性筛素数)
题目链接:https://nanti.jisuanke.com/t/30999 参考自博客:https://kuangbin.github.io/2018/09/01/2018-ACM-ICPC-Na ...
- [Luogu]A%BProblem——线性筛素数与前缀和
题目描述 题目背景 题目名称是吸引你点进来的[你怎么知道的] 实际上该题还是很水的[有种不祥的预感..] 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m接下来n行, ...
- leetcode 204. Count Primes(线性筛素数)
Description: Count the number of prime numbers less than a non-negative number, n. 题解:就是线性筛素数的模板题. c ...
- [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉
本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉 题目大意 给定n,m,求在1到n!内与m!互质的 ...
- C++ 线性筛素数
今天要写一篇亲民的博客了,尽力帮助一下那些不会线性筛素数或者突然忘记线性筛素数的大佬. 众所周知,一个素数的倍数肯定不是素数(废话).所以我们可以找到一个方法,普通的筛法(其实不算筛,普通的是判断一个 ...
随机推荐
- webview之学习文章(待续)
webview与js交互: Tencent/VasSonic(缓存优化方案) lzyzsd/JsBridge: pengwei1024/JsBridge: -----webview的框架 TheFin ...
- (整理)REHL6.5_安装本地yum
1.检查是否安装yum包 查看RHEL是否安装了yum,若是安装了,那么又有哪些yum包:rpm -qa |grep yum 2 删除redhat自带的yum包 rpm -qa|grep yum|xa ...
- html5编写软件哪个好?八款html5编写软件推荐
随着各大浏览器对HTML5技术支持的不断完善,未来HTML5必将改变我们创建Web应用程序的方式.而很多html5的初学者都想找一款好用的编写软件,这里主机吧就给大家推荐七款好用的html5编写软件. ...
- css选择器区别
空格选择器 ul li 选择ul 下面的所有li 元素 大于号选择器 ul>li 选择ul 下面的直接子元素 只能是儿子辈的 不能是孙子辈的
- express+websocket+exec+spawn=webshell
var child_process = require('child_process'); var ws = require("nodejs-websocket"); consol ...
- es6的理解
目录:let——和var的区别const 特性:暂时性死区解构赋值 [] {}属性简洁函数简洁 属性表达式可以作为对象的属性名字符串扩展数组扩展对象扩展 Object.getPrototypeOf(实 ...
- LeetCode 100. Same Tree 判断两棵二叉树是否相等 C++
Given two binary trees, write a function to check if they are the same or not. Two binary trees are ...
- 关于 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh的解决办法
记录工作中遇到的问题 someone could be eavesdropping on you right now (man-in-the-middle attack) ssh 由于远程机器或者重组 ...
- 在下载SOPC代码的过程中遇到的一些错误
(1)Error (209015): Can't configure device. Expected JTAG ID code 0x02D120DD for device 2, but found ...
- 记一次nginx强制将https请求重定向http
公司要做小程序,但是发现小程序只允许https请求 所以查了查资料使用nginx重定向请求得方式做 以下是过程: 阿里云ssl证书管理控制台申请ssl证书 下载nginx 证书: 解压后得到后缀为ke ...