线性筛素数和理解 洛谷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++ 线性筛素数
今天要写一篇亲民的博客了,尽力帮助一下那些不会线性筛素数或者突然忘记线性筛素数的大佬. 众所周知,一个素数的倍数肯定不是素数(废话).所以我们可以找到一个方法,普通的筛法(其实不算筛,普通的是判断一个 ...
随机推荐
- 【Eclipse】_Eclipse自动补全增强方法 & 常用快捷键
一,Eclipse自动补全增强方法 在Eclipse中,从Window -> preferences -> Java -> Editor -> Content assist - ...
- dubbo 在不同协议下携带上下文区别
如果走原生的dubbo协议,RpcContext.getContext()里的attarchments和values 是能够在节点间传递的 但如果hessian协议,attarchments和valu ...
- JSON 序列化与反序列化, 与XML相互转换.
方式一: 使用于 JavaScriptSerializer类 适用于普通场景, Excel导入导出, 前台传输查询参数直接处理等. JavaScriptSerializer serializer = ...
- 搭建真正的zookeeper集群
搭建zookeeper伪分布式集群 zookeeper是Hadop Ecosystem中非常重要的组件,它的主要功能是为分布式系统提供一致性协调服务, 提供的功能包括配置维护,域名服务,分布式同步和组 ...
- windows下的Redis主从集群搭建
Redis官方不提供Windows版本,目前Windows下的版本是有微软开源团队(Microsoft Open Tech group)维护. http://redis.cn/ redis中文网 wi ...
- Windows下虚拟机安装Mac OS X —– VMware Workstation12安装Mac OS X 10.11
1下载 镜像:Instal OS X Yosemite 10.10.3(14D131).cdr 密码:qhhm 2 unlocker208文件(链接:https://pan.baidu ...
- Web漏洞扫描工具(批量脱壳、反序列化、CMS)
一.什么是Web漏洞扫描工具 即是指“扫描Web应用以查找安全漏洞(如跨站脚本,SQL注入,命令执行,目录遍历和不安全服务器配置)的自动化工具”,其中许多可能是由不安全或不正确的编码和设计.另一方面, ...
- 转载:深入浅出Zookeeper(一) Zookeeper架构及FastLeaderElection机制
转载至 http://www.jasongj.com/zookeeper/fastleaderelection/: 原创文章,转载请务必将下面这段话置于文章开头处.本文转发自技术世界,原文链接 htt ...
- CentOS 7设置yum仅仅下载rpm不安装总结
前言 参考文章:https://linux.cn/article-7937-1.html 在参考文章的基础上进行总结. 使用download-only插件实现 首先我们可以使用downloadonly ...
- python 打开文件基础 (笔记)
1.打开文件:建立文件与程序的关联 open(filenname,mode) filenname:文件名(包括路径):mode :打开模式 模式 打开模式 含义 r 只读,文件不存在则报错 w 只写, ...