首页 > 其他分享 >欧拉筛

欧拉筛

时间:2024-12-13 09:32:40浏览次数:3  
标签:埃氏 int 18 枚举 素数 筛掉 欧拉

在素数筛法当中,首先先讲一下朴素的筛法和埃氏筛。

朴素筛法:对于任何一个数i,我们从2到sqrt(i)挨个枚举看是不是i都无法整除这些数,如果是的话那么就说明i是素数,反之则不是
埃氏筛:我们发现,在朴素筛法当中我们希望枚举每个数的因子,也就是说,当我们判断4是不是素数,我们枚举了2,判断6是不是素数,又枚举了2,那我们可不可以在判断2是不是素数的时候,发现2是素数,就直接把它的倍数都筛掉。这就是埃氏筛。

#include<bits/stdc++.h>

using namespace std;

int n,tot;
int Prime[100010];
bool vis[1000010];

int main() {
    cin >> n;
    for(int i = 2;i <= n;i++) {
        if(!vis[i]) {
            Prime[++tot] = i;
            for(int j = 2;j * i <= n;j++)
                vis[j * i] = true;
        }
    }
    for(int i = 1;i <= tot;i++)
        cout << Prime[i] << " ";

    return 0;
}

欧拉筛:尽管埃氏筛貌似已经非常优秀了,但是我们仍然发现它也并不是那么令人满意,因为,以18这个数为例,我们在判断2为素数的时候,就用2把18筛掉了,然而当我们在判断3为素数的时候,又把18筛掉了一遍,这样就造成了冗余的操作从而浪费了时间。那么怎么保证一个数一定只被筛掉一遍呢?这就是欧拉筛的核心思想,一个数如果不是素数,那么一定只被它的最小的素数因子筛掉。同样地以18为例,2×9=18,3×6=18,那么我们就在2的时候用2×9来筛掉18。那么问题是,怎么样保证只用2来筛掉18.这里给出一个感性证明,当我们枚举到6的时候,第二层循环枚举素数枚举到2,用6×2筛掉12后,此时我们就应该break掉不再枚举6乘2以后的素数,因为当前这个数(即6)一定可以拆成当前素数2乘上另外一个数,那么2以后的素数,也就是3,5等,我们发现6×3可以拆成2×3×3,也就是2×9,6×5可以拆成2×3×5,也就是2×15,那么我么完全可以在枚举到数9和15的时候再把18、30筛掉而不必现在就筛。而2一定比后面的这些素数小(因为它先被枚举到),那么就可以放心的break掉了,这就保证了一个数一定只被它最小的质因子筛掉而又不会漏筛。

#include<bits/stdc++.h>

using namespace std;

int n,tot;
int Prime[100010];
bool vis[1000010];

int main() {
    cin >> n;
    for(int i = 2;i <= n;i++) {
        if(!vis[i]) Prime[++tot] = i;
        for(int j = 1;j <= tot && i * Prime[j] <= n;j++) {
            vis[i * Prime[j]] = true;
            if(i % Prime[j] == 0) break;
        }
    }
    for(int i = 1;i <= tot;i++)
        cout << Prime[i] << " ";

    return 0;
}

标签:埃氏,int,18,枚举,素数,筛掉,欧拉
From: https://www.cnblogs.com/lwiwi/p/18604176

相关文章

  • c语言欧拉筛法求素数 #欧拉筛法 #c语言
    筛选一个小范围内的素数大家基本都会用遍历法,如筛选1~100的素数,大家可能会写出下面代码:#include<stdio.h>#include<math.h>intmain(){intnum;for(num=2;num<=100;num++){//遍历2到100的数inti;intis_prime=1;//先假设......
  • 欧拉定理及欧拉函数
    更新日志2024/12/04:添加线性筛法求欧拉函数完整证明以及模板前言一些话以及借鉴感谢[点击展开]从这里开始重写(学)数论,从头开始,就不搬运原博客了。欧拉函数部分借鉴这一篇博客,线性筛算法证明借鉴这一篇博客,在此一并感谢。线性筛法模板改自原博客,感觉当初的证明很神秘,使用......
  • 欧拉路/欧拉回路 学习笔记【未完工】
    判定有向图首先这张图将所有的有向边转为无向边之后图连通。反例:其次,我们知道当且仅当所有点的入度和出度都相等,才会有欧拉回路。因为一个点进去之后一定会出来,所以入度一定等于出度。同理,我们也可以知道入度和出度差\(1\)时,才会有欧拉路。因为不要从起点走回起点,所以起点......
  • 欧拉降幂
    喵喵喵~众所周知:$a^b\equiv\begin{cases}a^b&b<\varphi(m)\a^{b\bmod\varphi(m)+\varphi(m)}&b\ge\varphi(m)\end{cases}\pmodm$。同时,当$n>2$时,有$2\mid\varphi(n)$以及$\varphi(2kn)=2\varphi(n)\le\dfrac{\varphi(n)}2(2\nmidn)$。......
  • 1103 欧拉函数
    //1103欧拉函数.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/22/problem/489输入T,一共T组数据,每组一个数n,输出它的欧拉函数φ(n)。输入格式第一行一个数字T。接下来T行,每行一个数字n。输出格式一共T行,每行一......
  • 【算法】欧拉函数、快速幂、容斥原理
    欧拉函数内容:表示1-n中与n互质的个数原理:一个数可以被质因子表示,而除了质因子及其倍数,剩下的个数都是与n互质推导(容斥原理):​ 1-N总共有N个数,首先将质因子\(p_1,p_2...p_n\)中的倍数减去,因为质因子的倍数与n是不互质的,因此首先减去质因子倍数的个数:\[N=N-\frac{N}{p_1}-\f......
  • 欧拉路径
    欧拉路径模板题一个感性的定义:一笔画路径,经过一次所有的边,点可以多次走特别的,若该路径的起点与终点相同,则称其为欧拉回路欧拉路径的存在条件:此图连通;对于无向图,当且仅当度数为奇的点的个数为0或2;对于有向图,当且仅当入度与出度不同的点的个数为0或2;当入度与出度......
  • 欧拉系统postgresql 与PostGis 离线环境安装
    postgresql与PostGis离线环境安装上传文件至服务器#安装所需依赖yuminstall/opt/PGsql-13-gis/rpm/*-yPostgresql安装tar-zxvfpostgresql-13.2.tar.gz#进入该目录./configure--prefix=/usr/local/pgsql--with-uuid=ossp--with-libxmlmakemakeinstall#添......
  • 建投数据自主研发相关系统获得欧拉操作系统及华为鲲鹏技术认证书
    近日,经欧拉生态创新中心和华为技术有限公司测评,建投数据自主研发的投资项目管理系统、全面风险管理信息系统、商业不动产业务系统,完成了基于欧拉操作系统openEuler22.03、华为鲲鹏Kunpeng920(Taisha200)的兼容性测试。测试结果显示,产品兼容性良好、整体运行流畅、性能表现优异,成功......
  • 信息学奥赛初赛天天练-92-CSP-S2023阅读程序2-动态数组、反转函数、埃氏筛法、欧拉筛
    2023CSP-S阅读程序2判断题正确填√,错误填⨉;除特殊说明外,判断题1.5分,选择题3分,共计40分)01#include<iostream>02#include<cmath>03#include<vector>04#include<algorithm>05usingnamespacestd;0607longlongsolve1(intn){08vector<bo......