线性筛与欧拉函数、莫比乌斯函数
网上关于素数筛的资料很多,这里只是给出弱鸟整理的几个线性筛和应用。
最朴素的素数筛——埃拉托斯特尼筛法(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)=\sum_{d|i} f(d)
又由F(i)的含义得
F(i)=floor(n/i)*floor(n/i)
则利用莫比乌斯反演,得
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;
}
线性筛与欧拉函数、莫比乌斯函数相关推荐
- 欧拉线性筛 与 欧拉函数 + 几道例题
欧拉线性筛 生成素数表prime[]数组 const int maxn = 1e7+5; int prime[maxn]; int visit[maxn]; void Prime(){memset(v ...
- [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉
本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉 题目大意 给定n,m,求在1到n!内与m!互质的 ...
- 【模板题】欧拉函数与线性筛求欧拉函数
欧拉函数是什么? 定义:对于正整数nnn,欧拉函数是小于或等于nnn的正整数中与nnn互质的数的个数,记作φ(n)\varphi (n)φ(n). φ(1)=1\varphi (1)=1φ(1)=1. ...
- 线性筛(欧拉筛)——算法解析
算法简介: 欧拉筛是一个能够做到O(n)O(n)O(n)的时间复杂度,也就是线性的质数筛法,是目前性能最优秀的质数筛法.在很多算法和数据结构题目中都有大量的应用,是一个十分基础的工具.对于一个频繁使用 ...
- 线性筛法 欧拉筛c语言,[洛谷P3383][模板]线性筛素数-欧拉筛法
Hibernate Hql 总结 1.from子句 Hibernate中最简单的查询语句的形式如下: from eg.Cat该子句简单的返回eg.Cat类的所有实例. 通常我们不需要使用类的全限定名, ...
- 筛选质数,埃氏筛和欧拉筛(线性筛)
求len之内的所有的素数 除了比较常用的开根号的求法,还有两种更好的方法,埃氏筛和线性筛.其中埃氏筛更好理解,而线性筛(欧拉筛)不好理解但是更快. 埃氏筛 #include <bits/stdc ...
- 杜教筛(上):整除分块,积性函数,欧拉与莫比乌斯
整除分块: 当我们求∑i=1nf(⌊ni⌋)\sum_{i=1}^nf(\lfloor\frac{n}{i}\rfloor)∑i=1nf(⌊in⌋)的时候,如果1到n求一遍感觉太傻了,因为会有很多 ...
- AcWing 874. 筛法求欧拉函数(线性筛法求欧拉函数模板)
给定一个正整数 n,求 1∼n 中每个数的欧拉函数之和. 输入格式 共一行,包含一个整数 n. 输出格式 共一行,包含一个整数,表示 1∼n 中每个数的欧拉函数之和. 数据范围 1≤n≤10^6 输入 ...
- C++实现欧拉的totient 函数(Euler’s totient function)(附完整源码)
C++实现欧拉的totient 函数 C++Adaline实现欧拉的totient 函数算法完整源码(定义,实现,main函数测试) C++Adaline实现欧拉的totient 函数算法完整源码(定 ...
最新文章
- C#如何判断线程池中所有的线程是否已经完成(转)
- linux虚拟用户创建目录权限不足,在CentOs中安装vsFtpd并创建多个虚拟用户,且不同的用户拥有不同的权限以及指向不同的文件夹...
- Rational Rose2007无法启动,提示缺少“suite objects.dll”
- FilterDispatcher is deprecated! Please use
- ue4加载本地版本_【虚幻4】创建本地数据库
- Python 技术篇-用smtplib和email库实现邮件发送并展示本地图片实例演示
- pandas - 案例(美国2012年总统候选人政治献金数据分析)
- Spring Boot文档地址
- 【2012百度之星/初赛上】B:小小度刷礼品
- 汇编语言学习笔记(五)
- 查找字符串中要查找的字符串最后一次出现的位置
- ftp搜索文件_Windows10下搭建FTP服务器详解(多图预警)
- 【Flink】基于 Flink CEP 实时计算商品订单流失量
- 结构之法算法之道CSDN博客-第一期全部博文集锦[CHM 文件下载]
- 使用命令行提取微软补丁文件
- EPLAN Electric P8 2.7下载安装
- 北京最最最牛逼的 IT 公司全在这了!
- 互联网商业化中,广告策略到底有哪些?(一)
- 27个最佳免费WordPress主题(2022年精选)
- 马云说过的计算机名言,马云说过最洗脑10名言 马云经典语录大全
热门文章
- UEFI模式下安装Centos 7
- 关于el-table添加fixed或fixed=“right“无横向滚动条的解决方法
- 【百家争鸣】反思O2O模式:为何没有飞天的猪
- 【wifi使用指导】wifi模块怎么用?无线路由wifi模块SKW92A/SKW77网页配置说明
- python代码阅读神器,加速掌握开源项目
- SharePoint 2010 图片库缩略图 Web Part Web 部件
- cocos 龙骨动画导出为spine 格式并播放
- 【Cocos2d-x游戏开发】编译时出现 commands commence before first target
- Unity修改默认脚本编辑器
- 从企业数字化发展的四个阶段,看数字化创新战略