题目链接: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的更多相关文章

  1. 洛谷 P3383 【模板】线性筛素数-线性筛素数(欧拉筛素数)O(n)基础题贴个板子备忘

    P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范 ...

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

    P3383 [模板]线性筛素数 256通过 579提交 题目提供者HansBug 标签 难度普及- 提交  讨论  题解 最新讨论 Too many or Too few lines 样例解释有问题 ...

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

    P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范 ...

  4. 欧拉函数O(sqrt(n))与欧拉线性筛素数O(n)总结

    欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. POJ 2407.Relatives-欧拉函数 代码O(sqrt(n)): ll euler(ll n){ ll ans=n; ...

  5. ACM-ICPC 2018 南京赛区网络预赛 J题Sum(线性筛素数)

    题目链接:https://nanti.jisuanke.com/t/30999 参考自博客:https://kuangbin.github.io/2018/09/01/2018-ACM-ICPC-Na ...

  6. [Luogu]A%BProblem——线性筛素数与前缀和

    题目描述 题目背景 题目名称是吸引你点进来的[你怎么知道的] 实际上该题还是很水的[有种不祥的预感..] 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m接下来n行, ...

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

    Description: Count the number of prime numbers less than a non-negative number, n. 题解:就是线性筛素数的模板题. c ...

  8. [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉 题目大意 给定n,m,求在1到n!内与m!互质的 ...

  9. C++ 线性筛素数

    今天要写一篇亲民的博客了,尽力帮助一下那些不会线性筛素数或者突然忘记线性筛素数的大佬. 众所周知,一个素数的倍数肯定不是素数(废话).所以我们可以找到一个方法,普通的筛法(其实不算筛,普通的是判断一个 ...

随机推荐

  1. vim替换的两种方式

    最近操作一个超过30MB的一个文本文件,常用的编辑器打开就死.最后使用Vim,一路非常顺畅.不愧是久经历史考验的编辑器. 如何在Vim中将空格更换为\t 这个使用\s功能.具体命令为:\s\ \/t/ ...

  2. 一些常用的js循环,如for

    https://blog.csdn.net/u014399368/article/details/82862444

  3. Go语言操作MySQL数据库

    Go语言操作MySQL数据库 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用 ...

  4. nmcli配置ipv6

    nmcli配置ipv6 作者:Eric 微信:loveoracle11g [root@racooler ~]# nmcli connection show eno16777736 | grep ipv ...

  5. html/css/js----js中遇到的一些问题

    学习前端的时候有时也会遇到一些弄不明白的问题,学习js会有更多的方法不清楚它的用法,我谨以在学习中遇到的一些问题记录下来,以便日复习! 一."window.opener.location.r ...

  6. Asp.NET 简易通用WebServices 附件服务

    [toc] 总述: 用了很久的附件分离服务, .NET 2.0平台开始使用.  配置好服务后, 由调用端定义并管理目录级次.  调用端存储目录即可.  附件服务: 相应配置节点放入 web.confi ...

  7. extentreports

    关于extentreports使用的一些个人见解 首先导入jar包, 使用maven导入,我再次首先导入的是 <version>4.0.5</version>版本的jar包,但 ...

  8. expected_conditions模块提供了判断页面元素的16种方法

    1.title_is: 判断当前页面的title是否完全等于(==)预期字符串,返回布尔值2.title_contains : 判断当前页面的title是否包含预期字符串,返回布尔值3.presenc ...

  9. 四、Python-元组

    列表非常适合用于存储在程序运行期间可能变化的数据集.列表是可以修改的,这对处理网 站的用户列表或游戏中的角色列表至关重要. Python将不能修改的值称为不可变的,而不可变的列表被称为元组 一.元组( ...

  10. HttpClient使用代理IP

    在爬取网页的时候,有的网站会有反爬虫措施,导致服务器请求拒接,可以使用代理IP来访问,解决请求拒绝的问题 代理IP分 透明代理.匿名代理.混淆代理.高匿代理 1.透明代理(Transparent Pr ...