网上关于素数筛的资料很多,这里只是给出弱鸟整理的几个线性筛和应用。

最朴素的素数筛——埃拉托斯特尼筛法(Sieve of Eratosthenes)
复杂度 Olognlogn

int primes[MAXN],tot=0;
bool isPrime[MAXN];void getPrime()
{memset(isPrime,true,sizeof(isPrime));for(int i=2;i<MAXN;i++){if(isPrime[i]){primes[++tot]=i;for(int j=i+i;j<MAXN;j+=i)isPrime[j]=false;}}
}

欧拉素数筛
复杂度 On
其原理是每个合数都只会被一个质数筛去,因此为 On 线性筛法
关键代码原理是 每个比 i 大的合数,必可以拆分为一个比 i 小的质数和另一个合数之积

int primes[MAXN],tot=0;
bool isPrime[MAXN];void getPrime()
{memset(isPrime,true,sizeof(isPrime));for(int i=2;i<MAXN;i++){if(isPrime[i])primes[++tot]=i;for(int j=1;j<=tot;j++){if(i*primes[j]>=MAXN) break;isPrime[i*primes[j]]=false;if(i%primes[j]==0) break;//*****}}
}

掌握线性筛之后,可以利用线性筛求积性函数

  • 线性筛求欧拉函数
  • 线性筛莫比乌斯函数

积性函数f(x)满足:f(ab)=f(a)f(b),a,b互质。

1.线性筛求欧拉函数

顺便复(预)习欧拉函数
欧拉函数:wikipedia
在数论中,对正整数n,欧拉函数 ϕ(n) 是小于或等于n的正整数中与n互质的数的数目。

定义式:
欧拉函数ϕ(n)=n(1−1/p1)(1−1/p2)…(1−1/pk),p1…pk是n的k个不同的质因数。

观察到之前欧拉函数的筛法,在筛去一个合数(break)的同时能够得到它最小质因数 p 。假设 p 出现了 k 次,那么 f(p^k)和 f(n/p^k) 可以得到 f(n)

如果我们在筛去一个合数 i 的同时,记录它的每个质因数 pj 的次数,那么在转移至 i*pt 的同时,在筛去i·pt的同时得到它里面任意一个质因数的次数。

由定义式可得到以下结论:

ϕ(p)=p−1,p是质数。
假设当前从ϕ(i),ϕ(pt)转移到ϕ(ipt):
1、如果pt是在ipt中第一次出现的话(也就是pt不整除i),则ϕ(ipt)=ϕ(i)(pt−1)
2、如果pt不是在ipt中第一次出现的话(也就是pt整除i),则ϕ(ipt)=ϕ(i)pt

代码实现:

int tot=0;
int phi[maxn],prime[maxn];
bool isPrime[maxn];
void getphi(){mem(isPrime,true);//宏phi[1]=1;for(int i=2;i<=maxn;i++){if(isPrime[i]) prime[++tot]=i,phi[i]=i-1;//*for(int j=1;j<=tot;j++){if(i*prime[j]>maxn) break;isPrime[i*prime[j]]=false;if(i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];//*break;}else phi[i*prime[j]]=phi[i]*(prime[j]-1);//*}}
}

2. 莫比乌斯函数

莫比乌斯函数μ(d)的定义如下
(1)若d=1,那么μ(d)=1
(2)若d=p1p2…pk(p1…pk均为互异质数),那么μ(d)=(−1)^k
(3)其他情况下,μ(d)=0

假设当前从μ(i),μ(pt)转移到μ(i·pt),有以下几个式子便于我们筛出莫比乌斯函数:
1、如果pt是在ipt中第一次出现的话(也就是pt不整除i),则μ(i·pt)=−μ(i)
2、如果pt不是在ipt中第一次出现的话(也就是pt整除i),则μ(i·pt)=0

int tot=0;
int miu[maxn],prime[maxn];
bool isPrime[maxn];
void getmiu(){mem(isPrime,true);miu[1]=1;for(int i=2;i<=maxn;i++){if(isPrime[i]) prime[++tot]=i,miu[i]=-1;for(int j=1;j<=tot;j++){if(i*prime[j]>maxn) break;isPrime[i*prime[j]]=false;if(i%prime[j]==0){miu[i*prime[j]]=0;//略有不同break;}else miu[i*prime[j]]=-1*miu[i];}}
}

3.莫比乌斯反演

F(n),f(n) 是定义在非负整数集合上的两个函数,并且满足条件

那么有结论:

有些题目会要求求出f(n)的值,但是往往F(n)比f(n)更好求。如果我们难以求出f(n)的值,但是能找出一个F(n)函数,并且可以很轻松地求出F(n)的值的话,就应该使用莫比乌斯反演。

来个例题吧!
给一个正整数n,其中n<=10^7,求使得gcd(x,y)为素数的的(x,y)的个数,1<=x,y<=n。

分析:
对于本题,因为是使得gcd(x,y)为素数,所以必然要枚举小于等于n的素数,那么对于每一个素数pi,只需要求在区间 [1,n/pi] 中,满足有序对互质的对数。
因为gcd(x,y)=pi –> gcd(x/pi,y/pi)=1
设 f(pi)=(gcd(x,y)=pi)的种类数,F(pi) =(pi | gcd(x,y))的种类数
可得

F(i)=∑d|if(d)

F(i)=\sum_{d|i} f(d)
又由F(i)的含义得

F(i)=floor(n/i)*floor(n/i)

则利用莫比乌斯反演,得

f(i)=∑d|iμ(d)F(id)

f(i)=\sum_{d|i} μ(d)F(\frac{i}{d})

再枚举 i ,范围为 [1,n/pi]

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef set<int> Set;
typedef vector<int> Vec;
#define fast ios_base::sync_with_stdio(false)
#define mem(s,t) memset(s,t,sizeof(s))
#define D(v) cout<<#v<<" "<<v<<endl
#define mod 1000000007
#define inf 0x3f3f3f3f
const int maxn =1e7+10;
ll tot=0,ans=0,n;
int miu[maxn],prime[1000005];
bool isPrime[maxn];
void getmiu(){mem(isPrime,true);miu[1]=1;for(int i=2;i<=maxn;i++){if(isPrime[i]) prime[++tot]=i,miu[i]=-1;for(int j=1;j<=tot;j++){if(i*prime[j]>maxn) break;isPrime[i*prime[j]]=false;if(i%prime[j]==0){miu[i*prime[j]]=0;break;}else miu[i*prime[j]]=-1*miu[i];}}
}void solve(){scanf("%d",&n);for(int k=1;prime[k]<=n;k++){int t=n/prime[k];for(int i=1;i<=t;i++){ans+=(ll)(t/i)*(t/i)*miu[i];}}printf("%lld\n",ans);
}int main(){
#ifdef LOCALfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#endifmem(prime,1);getmiu();solve();return 0;
}

线性筛与欧拉函数、莫比乌斯函数相关推荐

  1. 欧拉线性筛 与 欧拉函数 + 几道例题

    欧拉线性筛 生成素数表prime[]数组 const int maxn = 1e7+5; int prime[maxn]; int visit[maxn]; void Prime(){memset(v ...

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

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

  3. 【模板题】欧拉函数与线性筛求欧拉函数

    欧拉函数是什么? 定义:对于正整数nnn,欧拉函数是小于或等于nnn的正整数中与nnn互质的数的个数,记作φ(n)\varphi (n)φ(n). φ(1)=1\varphi (1)=1φ(1)=1. ...

  4. 线性筛(欧拉筛)——算法解析

    算法简介: 欧拉筛是一个能够做到O(n)O(n)O(n)的时间复杂度,也就是线性的质数筛法,是目前性能最优秀的质数筛法.在很多算法和数据结构题目中都有大量的应用,是一个十分基础的工具.对于一个频繁使用 ...

  5. 线性筛法 欧拉筛c语言,[洛谷P3383][模板]线性筛素数-欧拉筛法

    Hibernate Hql 总结 1.from子句 Hibernate中最简单的查询语句的形式如下: from eg.Cat该子句简单的返回eg.Cat类的所有实例. 通常我们不需要使用类的全限定名, ...

  6. 筛选质数,埃氏筛和欧拉筛(线性筛)

    求len之内的所有的素数 除了比较常用的开根号的求法,还有两种更好的方法,埃氏筛和线性筛.其中埃氏筛更好理解,而线性筛(欧拉筛)不好理解但是更快. 埃氏筛 #include <bits/stdc ...

  7. 杜教筛(上):整除分块,积性函数,欧拉与莫比乌斯

    整除分块: 当我们求∑i=1nf(⌊ni⌋)\sum_{i=1}^nf(\lfloor\frac{n}{i}\rfloor)∑i=1n​f(⌊in​⌋)的时候,如果1到n求一遍感觉太傻了,因为会有很多 ...

  8. AcWing 874. 筛法求欧拉函数(线性筛法求欧拉函数模板)

    给定一个正整数 n,求 1∼n 中每个数的欧拉函数之和. 输入格式 共一行,包含一个整数 n. 输出格式 共一行,包含一个整数,表示 1∼n 中每个数的欧拉函数之和. 数据范围 1≤n≤10^6 输入 ...

  9. C++实现欧拉的totient 函数(Euler’s totient function)(附完整源码)

    C++实现欧拉的totient 函数 C++Adaline实现欧拉的totient 函数算法完整源码(定义,实现,main函数测试) C++Adaline实现欧拉的totient 函数算法完整源码(定 ...

最新文章

  1. C#如何判断线程池中所有的线程是否已经完成(转)
  2. linux虚拟用户创建目录权限不足,在CentOs中安装vsFtpd并创建多个虚拟用户,且不同的用户拥有不同的权限以及指向不同的文件夹...
  3. Rational Rose2007无法启动,提示缺少“suite objects.dll”
  4. FilterDispatcher is deprecated! Please use
  5. ue4加载本地版本_【虚幻4】创建本地数据库
  6. Python 技术篇-用smtplib和email库实现邮件发送并展示本地图片实例演示
  7. pandas - 案例(美国2012年总统候选人政治献金数据分析)
  8. Spring Boot文档地址
  9. 【2012百度之星/初赛上】B:小小度刷礼品
  10. 汇编语言学习笔记(五)
  11. 查找字符串中要查找的字符串最后一次出现的位置
  12. ftp搜索文件_Windows10下搭建FTP服务器详解(多图预警)
  13. 【Flink】基于 Flink CEP 实时计算商品订单流失量
  14. 结构之法算法之道CSDN博客-第一期全部博文集锦[CHM 文件下载]
  15. 使用命令行提取微软补丁文件
  16. EPLAN Electric P8 2.7下载安装
  17. 北京最最最牛逼的 IT 公司全在这了!
  18. 互联网商业化中,广告策略到底有哪些?(一)
  19. 27个最佳免费WordPress主题(2022年精选)
  20. 马云说过的计算机名言,马云说过最洗脑10名言 马云经典语录大全

热门文章

  1. UEFI模式下安装Centos 7
  2. 关于el-table添加fixed或fixed=“right“无横向滚动条的解决方法
  3. 【百家争鸣】反思O2O模式:为何没有飞天的猪
  4. 【wifi使用指导】wifi模块怎么用?无线路由wifi模块SKW92A/SKW77网页配置说明
  5. python代码阅读神器,加速掌握开源项目
  6. SharePoint 2010 图片库缩略图 Web Part Web 部件
  7. cocos 龙骨动画导出为spine 格式并播放
  8. 【Cocos2d-x游戏开发】编译时出现 commands commence before first target
  9. Unity修改默认脚本编辑器
  10. 从企业数字化发展的四个阶段,看数字化创新战略