这是一个很有趣的专题,花了一个上午理解了。
很明显,就是用来筛选素数的,时间复杂度为O(n)
具体思路:
1.线性筛素数
(1)先for一遍
(2)判断有没有被否认过是一个素数,若没有,添加一个素数
(3)无论是不是,都for一遍,把下面的合数都筛一遍
(4)遇到是我现在判断的这个数的因子的话,就break
原因:(1)例如 27=3*3*3 如果再扫下去的话,还不如直接 27=9*3
(2)要用每一个数的最小因数去筛选。
(3)避免重复,说好的线性。
2.线性筛欧拉函数(拓展)
(1)加多一个数组pri[i]表示比i小的互质的个数
(2)简单点说就是:
(1)从12=2^2*3,之后pri的个数为 12=12*(1-1/2)*(1-1/3) 可知
n=n*(1-1/p1)*(1-1/p2)*......*(1-1/pn)
p是n的公因数
(2)当素数n时,pri[n]=n-1
( 3)当E(ab) 前提是ab互质 E(ab)=E(a)*E(b) 假设ab是质数,其实不是素数也一样,方便写而已,只要互质即可
=a*(1-1/p1)*b*(1-1/p2)
=(a*b) * (1-1/p1) *(1-1/p2)
=E(ab)
(4)当E(ab) 前提是ab不互质 E(ab)=E(a)*b 因为a是b的倍数
假如说E(12*3)=12*3*(1-1/2)(1-1/3)
因为12已经包括了3的因子了,所以就不用再算多一次了
(3)复杂点说看别人证明:
欧拉函数的几个性质:E(x)表示比x小的且与x互质的正整数的个数。
1、*若p是素数,E(p)=p-1。// 这个没意见!
2、*E(p^k)=p^k - p^(k-1)=(p-1)*p^(k-1)
证:令n=p^k,小于等于n的正整数数中,所有p的倍数共有p^(k-1)个。//同意?
1~n出去p的倍数,所以E(n)= n - p^(k-1) =p^k - p^(k-1) = (p-1)*P^(k-1).得证。
想通以上证明很重要,因为是看懂下来证明的基础。
3、*若ab互质,则E(a*b)=E(a)*E(b),欧拉函数是积性函数.
*对任意数n都可以唯一分解成n=p1^a1*p2^a2*p3^a3*...*pn^an(pi为素数).
则E(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn)// 这个没意见!可以理解
=(p1^a1*p2^a2*p3^a3*...*pn^an)*[(p1-1)*(p2-1)*(p3-1)*...*(pn-1)]/(p1*p2*p3*...*pn)
=(p1-1)*p1^(a1-1)*(p2-1)*p2^(a2-1)*...*(pn-1)*pn^(an-1)
=E(p1^a1)*E(p2^a2)*E(p3^a3)*...*E(pn^an) //由此证明了互质的可以用各自的欧拉函数直接乘
所以当ab互质的时候E(a*b)=E(a)*E(b)
不互质的时候怎么办呢?
当b是质数,a%b==0,那么由上面的证明,b并到其中一个b^x里面,所以E(a*b)=E(a)*b
接下来就是题目了:
Algorithm: | Prime and Euler | |||
pku2407 | Relatives | 简单的欧拉函数,利用E(p^k)=(p-1)(p^(k-1))即可 | 10min | 1 |
pku1284 | Primitive Roots | 费马小定理可知,E(n-1)的解 | 10min | 1 |
pku2478 | Farey Sequence | 欧拉+累加 | 10min | 1 |
bzoj2190 | [SDOI2008]仪仗队 | 去一下下面的一行和最左边的一行再欧拉函数累加,等价思维自己想 | 20min | 2 |
hdu2098 | 分拆质数和 | 用线性筛选素数扫一遍 | 10min | 1 |