题目链接: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. 使用docker加载已有镜像安装Hyperledger Fabric v1.1.0

    背景 每次在新的服务器上安装Hyperledger Fabric网络时,通过fabric官方提供的脚本安装时,需要从网络上down下近10G的fabric相关镜像,这个过程是漫长及痛苦的,有时因网络问 ...

  2. snmp服务中snmpwalk命令常用方法总结

    在日常监控中,经常会用到snmp服务,而snmpwalk命令则是测试系统各种信息最有效的方法,命令格式: snmpwalk  -c SNMP读密码 -v 1或2(代表SNMP版本) 交换机或路由器IP ...

  3. 20175236 2018-2019-2 《Java程序设计》第六周学习总结

    教材学习内容总结 第七章 try :用于监听.将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出. catch:用于捕获异常.catch用来捕获try ...

  4. 持续更新scrapy的错误,ValueError: Missing scheme in request url:

    只需要将 for href in response.xpath('XX').extract(): yield Request(hrefs) 修改为下面,就可以显示出来 for href in resp ...

  5. Linux背背背(6)

    目录 1.用户 2.用户组 3.权限设置 用户管理 添加用户 命令:useradd 语法:#useradd 用户名 所有的用户添加之后都会存储在一个文件中,会存储在passwd文件中,位置位于/etc ...

  6. python爬百度文库课件

    库:re;selenium;requests 源码: from selenium import webdriverimport reimport requests def open_img(items ...

  7. [java,2017-06-12] myEclipse双击无法打开文件

    点击 Window---->Preferences---> General---> Editors ---> File Associations 选择Associated ed ...

  8. Spring3.2.0 之后各个版本完整包下载地址

    留作工作学习使用 现在Spring官网已经很难找到完整包的下载地址,都已经迁移到Maven上,这给不能用Maven或者不愿用Maven的各位带来了不小的麻烦. 经过挖掘,找到了下载3.2之后各个版本完 ...

  9. python count函数

    描述 Python count() 方法用于统计字符串里某个字符出现的次数.可选参数为在字符串搜索的开始与结束位置. 语法 count()方法语法: str.count(sub, start= 0,e ...

  10. ExcelPackage 读取、导出excel

    private static string GetString(object obj) { try { return obj.ToString(); } catch (Exception ex) { ...