我们一般写的埃氏筛消耗的时间都是欧拉筛的三倍,但是欧拉筛并不好想(对于我这种蒟蒻)

虽然 -- 我 -- 也可以背过模板,但是写个不会的欧拉筛不如写个简单易懂的埃氏筛

于是就有了优化

这个优化还是比较厉害的,能把埃氏筛的消耗的时间提的跟欧拉筛差不多


以下内容需要先学会埃氏筛

学会的埃氏筛就明白它的原理了吧

#include<bits/stdc++.h>
using namespace std;
int n, m ,Is_p[10000001];
int main() {
cin >> n >> m;
Is_p[1] = 1;
for(int i = 2; i <= n; ++i)
if(Is_p[i] == 0)
for(int j = 2; i * j <= n; ++j)
Is_p[i * j] = 1;
int a = 0;
for(int i = 1; i <= m ;++i) {
scanf("%d", &a);
if(Is_p[a] == 1) cout << "No\n";
else cout << "Yes\n";
}
return 0;
}

这是一种最普通的埃氏筛了

由于我的小号名字很嚣张,我就抹掉了

运行总时间是4000多ms

炒鸡慢啊,有木有

在这份代码中有一个地方明显可以优化

     for(int i = 2; i <= n; ++i)
if(Is_p[i] == 0)
// for(int j = 2; i * j <= n; ++j)
Is_p[i * j] = 1;
1.

绿油油的那行就是,i * j <= n,这个语句中每次执行循环都会执行一遍

i * j执行多了也会卡的,所以不如定义一个数(yy) = n / i , j只需要枚举到yy就可以.

2.

还有最外层循环的i <= n,其实没必要执行这么多次,因为一个数n总能被

√n 筛掉所以只需要枚举到√n.

但是sqrt(n)算多了反而得不偿失,所以像刚才一样处理

3.

还有一个更重要的地方,也是每一个课本上都讲过的,j只需要从i开始,为什么课本上都有.

完成这3项,埃氏筛也基本不能更快了,

交上去试试:

我同学的欧拉筛(这是位dalao,没事可以加他去膜一膜,他有多么强呢?他跟我学的时间差不多,我才刚学树,他就已经会了主席树......)

可以看到10个点总共慢了200ms,平均一个才慢20ms.

估计没有出题人可以把时间卡的这么"好"(让欧拉筛过,但不让埃氏筛过)吧

而且我占的空间比他少的多

我来顺便分析一下他的名字,其实他的名字后两个字是带三点水的但是去掉了,并且在前面加上了个水比

这说明了什么,他想说明他"没有水",但是说自己很水,

用人话来讲就是:不水而且很谦虚

上述内容纯属扯淡,进入正题

emmmm..好像没什么要说的了

交代

                   .-' _..`.
/ .'_.'.'
| .' (.)`.
;' ,_ `.
.--.__________.' ; `.;-'
| ./ /
| | /
`..'`-._ _____, ..'
/ | | | |\ \
/ /| | | | \ \
/ / | | | | \ \
/_/ |_| |_| \_\
|__\ |__\ |__\ |__\

#include<bits/stdc++.h>
using namespace std;
bool a[10000001];
void ol(int x){
int xx = sqrt(x);
for (int i = 2; i <= xx; ++i)
{
if (a[i] == 0)
{
int yy = x / i;
for (int j = i; j <= yy; ++j)
{
a[i * j] = 1;
}
}
}
} int main()
{
int n,m,t;
cin>>n>>m;
a[0] = 1;//这里要特判一下,不然会WA两个点
a[1] = 1;
ol(n);
for(int i=1;i<=m;i++){
scanf("%d",&t);
if(a[t] == 0)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}

我把欧拉筛也贴上吧

#include<cstdio>
#include<iostream>
using namespace std;
int n, m, p[10000001], cnt, IsNotPrime[10000001];
int main() {
scanf("%d%d", &n, &m);
IsNotPrime[0] = IsNotPrime[1] = 1;
for(int i=2; i < n; ++i) {
if(!IsNotPrime[i]) p[++cnt] = i;
for(int j = 1; i*p[j] <= n && j <= cnt; ++j) {
IsNotPrime[i * p[j]] = 1;
if(! (i % p[j])) break;
}
}
int k;
for(int i = 1; i <= m; ++i) {
scanf("%d", &k);
if(IsNotPrime[k]) cout << "No\n";
else cout << "Yes\n";
}
return 0;
}

埃氏筛优化(速度堪比欧拉筛) + 洛谷 P3383 线性筛素数 题解的更多相关文章

  1. 洛谷P3383线性筛素数

    传送门 代码中体现在那个 $ break $ $ prime $ 数组 中的素数是递增的,当 $ i $ 能整除 $ prime[j ] $ ,那么 $ iprime[j+1] $ 这个合数肯定被 $ ...

  2. 欧拉筛(线性筛) & 洛谷 P3383 【模板】线性筛素数

    嗯.... 埃氏筛和欧拉筛的思想都是相似的: 如果一个数是素数,那么它的所有倍数都不是素数.... 这里主要介绍一下欧拉筛的思路:(欧拉筛的复杂度大约在O(n)左右... 定义一个prime数组,这个 ...

  3. 【BZOJ4805】欧拉函数求和(杜教筛)

    [BZOJ4805]欧拉函数求和(杜教筛) 题面 BZOJ 题解 好久没写过了 正好看见了顺手切一下 令\[S(n)=\sum_{i=1}^n\varphi(i)\] 设存在的某个积性函数\(g(x) ...

  4. 【埃氏筛】洛谷P3383埃氏筛模板

    思路: 如果我们要筛出 [1, n] 内的所有素数,使用 [1, √n] 内的素数去筛就可以了 设bool型数组 a,a[i] 表示 i 是否被某个素数筛过 从 2 开始枚举每个数 i: 若 a[i] ...

  5. 欧拉筛法模板and 洛谷 P3383 【模板】线性筛素数(包括清北的一些方法)

    题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入格式 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行包含一个不小于1 ...

  6. [洛谷P3383][模板]线性筛素数-欧拉筛法

    Description 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) Input&Output Input 第一行包含两个正整数N.M,分别表示查询的 ...

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

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

  8. bzoj 4916: 神犇和蒟蒻【欧拉函数+莫比乌斯函数+杜教筛】

    居然扒到了学长出的题 和3944差不多(?),虽然一眼看上去很可怕但是仔细观察发现,对于mu来讲,答案永远是1(对于带平方的,mu值为0,1除外),然后根据欧拉筛的原理,\( \sum_{i=1}^{ ...

  9. 51nod 1237 最大公约数之和 V3【欧拉函数||莫比乌斯反演+杜教筛】

    用mu写lcm那道卡常卡成狗(然而最后也没卡过去,于是写一下gcd冷静一下 首先推一下式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j) \] \[ \sum_{i= ...

随机推荐

  1. WPF设置全局控件样式

    原文:WPF设置全局控件样式 方法: 在资源文件APP.XAML中添加如下资源 <Application x:Class="_360UI.App" xmlns="h ...

  2. C# Modbus 数据读取 使用NModBus4库

    ModBus通讯协议 方法名 作用 所需参数 返回值 对应功能码 ReadCoils 读取DO的状态 从站地址(8位) byte slaveAddress 起始地址(16位) ushort start ...

  3. Django TypeError: render() got an unexpected keyword argument 'renderer'

    场景: Xadmin添加plugin 来源: 1. xadmin与DjangoUeditor的安装 (第3.3章节) 2. 增加富文本编辑器Ueditor (第14.7章节) 报错: Django T ...

  4. c# winform结合数据库动态生成treeview的父节点和子节点方法和思路

    tb_food表的结构如图一: tb_foodtype表的结构如图二: //获取tb_foodtype表中的所有数据 private void InitDataTable() { SqlConnect ...

  5. APS.NET MVC + EF (08)---数据注解和验证

    对于Web开发人员来说,用户输入验证一直是一个挑战.不仅在客户端浏览器中需要执行验证逻辑,在服务器端也需要执行.如果觉得验证是令人望而生畏的繁杂琐事,ASP.NET MVC框架提供了数据注解的方式帮助 ...

  6. java 泛型和object比较

    引言 我们使用object和泛型做形参,都是为了让这个方法能接收更多类型的对象,让程序变得更健壮,代码复用率更高.当我们回看自己写的代码时会发现,好像使用泛型的地方使用object也可以,使用obje ...

  7. ThinkPHP5 Nginx通用配置

    项目配置内容如下: server { #配置监听端口 listen 80; listen [::]:80; #设置网站根目录作为变量root set $root /var/www/web; #设置网站 ...

  8. 记录下登录Xcode 时出现 please sign in with an app-specific....

    今天做到准备提交到APP store时,要用xcode提交,在xcode->open developer tool->application loader时,要登录自己的ID,我登录时输入 ...

  9. linux系统IO操作

    本文重点说明下面内容: 什么是标准IO,什么是文件IO? 什么是Direct IO? O_SYNC标识有什么意义? 各个层面的缓存如何同步? 还在page cache中的脏页可以读写吗? IO路径上的 ...

  10. [SourceInsight].source insight 使用技巧

    转自:https://www.veryarm.com/140428.html 1  开胃菜-初级应用 1.1  选择美丽的界面享受工作 虽然不能以貌取人,但似乎从来没有人责备以貌取软件的.SI的华丽界 ...