一些关于贾志鹏线性筛的知识
2016-02-27 19:16
239 查看
贾志鹏线性筛,是一个神奇的东西,可以O(n)筛出积性函数在1-n范围内的值
我们都学过素数筛,贾志鹏线性筛和素数筛是差不多的
关于积性函数……我并不知道有哪些,只知道有欧拉函数和莫比乌斯函数,当然,我只会欧拉函数的筛法
欧拉函数的公式是phi(n)=n*(1-1/p1)*(1-1/p2)*……*(1-1/pn) n=p1^q1*……*pn^qn
所以我们可以在这个公式上做一做文章
显然,当我们第一次遇见pi的倍数,phi(n)=phi(pi)*phi(n/pi),又因为pi是质数,phi(pi)=pi-1
当我们第二次遇到pi的倍数及以上,phi(n)=pi*phi(n/pi)
所以可以很自然地写出下列程序:
for (i=2;i<=n;i++){
if (!check[i]){
a[i]=i-1;
prime[tot++]=i;
}
for (j=0;j<tot;j++){
if (i*prime[j]>n) break;
check[i*prime[j]]=true;
if (i % prime[j]){
a[i*prime[j]]=a[i]*(prime[j]-1);
}
else{
a[i*prime[j]]=a[i]*prime[j];
break;
}
}
}
其中那个break是因为:
假设第一次遇见素数p,是因为n=pm,这一次是n=p'm'
那么因为n=pm=p'm',p,p'都是质数
所以p|m'
所以p后面的p'*m'都可以转化成p乘上一个数
因为每个数的欧拉函数都只会被计算一次,所以时间复杂度为O(n)
提供例题*2,bzoj2818和bzoj2190
我们都学过素数筛,贾志鹏线性筛和素数筛是差不多的
关于积性函数……我并不知道有哪些,只知道有欧拉函数和莫比乌斯函数,当然,我只会欧拉函数的筛法
欧拉函数的公式是phi(n)=n*(1-1/p1)*(1-1/p2)*……*(1-1/pn) n=p1^q1*……*pn^qn
所以我们可以在这个公式上做一做文章
显然,当我们第一次遇见pi的倍数,phi(n)=phi(pi)*phi(n/pi),又因为pi是质数,phi(pi)=pi-1
当我们第二次遇到pi的倍数及以上,phi(n)=pi*phi(n/pi)
所以可以很自然地写出下列程序:
for (i=2;i<=n;i++){
if (!check[i]){
a[i]=i-1;
prime[tot++]=i;
}
for (j=0;j<tot;j++){
if (i*prime[j]>n) break;
check[i*prime[j]]=true;
if (i % prime[j]){
a[i*prime[j]]=a[i]*(prime[j]-1);
}
else{
a[i*prime[j]]=a[i]*prime[j];
break;
}
}
}
其中那个break是因为:
假设第一次遇见素数p,是因为n=pm,这一次是n=p'm'
那么因为n=pm=p'm',p,p'都是质数
所以p|m'
所以p后面的p'*m'都可以转化成p乘上一个数
因为每个数的欧拉函数都只会被计算一次,所以时间复杂度为O(n)
提供例题*2,bzoj2818和bzoj2190
相关文章推荐
- Objective-C ,KVC研究,几种属性赋值的方法
- [国嵌攻略][077][Linux时间编程]
- 中国计算机学会CCF推荐国际学术会议和期刊目录-计算机科学理论
- PHP的工作原理以及lamp四者之间的关系
- DFS算法初探
- Grub2引导Grub4dos菜单写法
- 中国计算机学会CCF推荐国际学术会议和期刊目录-软件工程/系统软件/程序设计语言
- Android 图片缓存之内存缓存技术LruCache
- 表连接的方式-哈希连接
- 中国计算机学会CCF推荐国际学术会议和期刊目录-网络与信息安全
- mysql 更改root账户密码 - mysql-5.7.11-osx10.10
- POJ 2135_Farm Tour
- ArrayList和LinkedList的区别
- 中国计算机学会CCF推荐国际学术会议和期刊目录-计算机网络
- POJ 2135_Farm Tour
- C语言学习笔记8-函数
- 【ONTAK2010】【BZOJ3551】Peaks加强版
- java不用api实现单链表反转(二)
- Autolayout其他用法
- 中国计算机学会CCF推荐国际学术会议和期刊目录-计算机体系结构/并行与分布计算/存储系统