您的位置:首页 > 其它

一些关于贾志鹏线性筛的知识

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: