侵删
以下内容均来自TA爷课件,我只是改了几个小的地方qwq
请关闭浏览器的极速模式后阅读(极速模式显示的公式为什么辣么粗糙啊qwq)
枚举除法
- (leftlfloorfrac{n}{i} ight floor)只有(Oleft(sqrt{n} ight))种取值。
- 对于(i),(leftlfloorfrac{n}{leftlfloorfrac{n}{i} ight floor} ight floor)是与(i)被(n)除并下取整取值相同的一段区间的右端点。
- 一个很有用的性质:(leftlfloorfrac{n}{ab} ight floor=leftlfloorfrac{leftlfloorfrac{n}{a} ight floor}{b} ight floor=leftlfloorfrac{leftlfloorfrac{n}{b} ight floor}{a} ight floor)
- 上取整也有3所述的性质。
积性函数
- (f(ab)=f(a)f(b),(a,b)=1)
- 完全积性:不要求((a,b)=1)
- 考虑时一般会考虑成(f(x)=prodlimits_{i}fleft(p_i^{k_i} ight))
- 当(f)不是0的常值函数时,(f(1)=1)
- 积性函数的狄利克雷前缀和也是积性函数。
- 两个积性函数的狄利克雷卷积也是积性函数。
- 积性函数可以线性筛出。线筛可以找到每个数(x)的最小质因子(p_1)及其次数(k_1)。如果我们能以较小的代价((O(1)))求出(fleft(p_1^{k_1} ight)),便可以线筛了。
初等积性函数(mu)
- 栗子:给定(n),(m),求(sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}[iot j],n,m leqslant 10^9),不用(mu)怎么做?
容斥!设dp数组(f(i,j))为当(n=i,m=j)时的答案。
时间复杂度(Oleft(sumlimits_{i=1}^{leftlfloorsqrt{n}
ight
floor}left(sqrt{leftlfloorfrac{n}{i}
ight
floor}+sqrt{i}
ight)
ight)=Oleft(n^{frac{3}{4}}
ight))
那么(mu)是什么?就是容斥系数!
(mu)显然是一个积性函数。
2. $$sumlimits_{d|n}mu(d)=left{egin{array}{rcl}1&,&n=1 &,&n
eq1end{array}
ight.$$
3. 莫比乌斯反演
- 回到栗子:
当然这样还是做不了。。。
所以我们需要杜教筛!(后面再说吧。。)
不过大多数(mu)的题(第一步)这么化,所以这个式子还是比较重要的。
初等积性函数(varphi)
- (varphi(n)=1~n与n互质的数的个数)
所以由定义便可直接写出:
这样就可以线筛出来了,而且可以看出(varphi)是一个积性函数。
2. 从刚才的式子可以看出,(varphi)完全可以用(mu)代替,那么我们为什么需要(varphi)呢?
很大一部分原因是它定义比较直观,比较容易想到。
3. (varphi)的性质:$$sumlimits_{d|n}varphi(d)=sumlimits_{d|n}dsumlimits_{g|frac{n}{d}}mu(g)=n$$
4. 栗子:求(sumlimits_{i=1}^nsumlimits_{j=1}^m(i,j)),多组数据,(t,n,mleqslant 10^5)。
杜教筛
- 求(sumlimits_{i=1}^nmu(i),nleqslant 10^{11})
直接求不好求,但是我们有(sumlimits_{i=1}^nsumlimits_{d|i}mu(d)=1)
化一下蛤:(sumlimits_{i=1}^nsumlimits_{j=1}^{leftlfloorfrac{n}{i} ight floor}mu(j)=1),(sumlimits_{i=1}^nmu(i)=1-sumlimits_{i=2}^nsumlimits_{j=1}^{leftlfloorfrac{n}{i} ight floor}mu(j))
核心思想是枚举约数,这样就可以递推/递归求解了。
时间复杂度(Oleft(n^{frac34} ight))。
但是注意到当(n)比较小的时候其实我们可以(O(n))线筛出来。
所以我们考虑分类讨论,线筛出≤B的,>B的递推。
时间复杂度(Oleft(B+sumlimits_{i=1}^{frac nB}sqrt{frac ni} ight)=Oleft(B+frac n{sqrt{B}} ight))
求导一下可知在(B=n^{frac23})时取得最小值(Oleft(n^frac23 ight))。 - 回到栗子:这样的话最初的栗子就会做了吧~
注意到杜教筛的时候不仅是求出了(sumlimits_{j=1}^nmu(j)),还顺便求出了所有的(sumlimits_{j=1}^{leftlfloorfrac ni
ight
floor}mu(j)),所以可以和普通的枚举除法完美契合。
3. 那么怎么求(sumlimits_{i=1}^nvarphi(i))?
下面讲些题吧~(不一定都是反演哦)
- 求(sumlimits_{i=1}^nsumlimits_{j=1}^mlcm(i,j)),(n,mleq10^{11})
如果我们可以杜教筛出(sumlimits_{i=1}^nmu(i)i^2),就可以做到(Oleft(n^{frac34}
ight))。
这是可以的
但是我们当然不必这么做。
可以直接令(f(n,m))表示(1n,1m)中所有互质数对乘积和。
那么(f(n,m)=frac{n(n+1)m(m+1)}4-sumlimits_{i=2}^{min(n,m)}i^2fleft(leftlfloorfrac ni
ight
floor,leftlfloorfrac mi
ight
floor
ight)),直接dp就好了。
但是我们需要(Oleft(n^frac 23
ight))
枚举除法,我们便只需求(sumlimits_{i=1}^nisumlimits_{d|i}mu(d)d)
它等于(sumlimits_{i=1}^nisumlimits_{j=1}^{leftlfloorfrac ni
ight
floor}mu(j)j^2)
我们先求出(sumlimits_{i=1}^nmu(i)i^2)
这个刚才已经讲过了。
然后前者便可以预处理+直接求。
预处理的时候需要线性筛
这题中涉及一种很重要的杜教筛的思路。
就是对于不能直接杜教筛的式子,可以将其与另一个前缀和易求的积性函数狄利克雷卷积,使得卷积后的函数前缀和也易求。
比如这道题就是与(f(x)=x^2)卷积。
这道题也涉及到一些常见的化式子的方法。
(gcd omu),(mu ovarphi)
对于i,j,ij三项贡献的这种,可以枚举ij将其化为狄利克雷卷积,也可以枚举i和j化成带下取整的式子;一般来讲前者往往易于预处理,可以应付多组询问,后者则在单次询问中有优秀表现。
2. SDOI2015 约数个数和
求(sumlimits_{i=1}^nsumlimits_{j=1}^md(i,j)),多组数据,(T,n,mleq10^5),(d(i,j)=sumlimits_{x|i}sumlimits_{y|j}[xot y])
预处理(Oleft(nlog n
ight)/Oleft(nsqrt n
ight)),查询(Oleft(Tsqrt n
ight))
3. BZOJ2820 YY的gcd
求((x,y)=质数),(xin[1,n]),(yin[1,m])的数对个数。多组数据,(n,mleq10^7),(Tleq10^4)
预处理(O(n)/O(nlglg n)),查询(O(Tsqrt n))
4. FZU2016 how many tuples
有m个数,第i个数的取值范围是([1,a_i]),求这m个数gcd为1的方案数。多组数据,10s时限,(tleq10^3),(mleq20),(aileq10^8)
直接杜教筛就可以了,杜教筛的时候预处理(10^7)。
枚举除法的时候需要用堆。时间复杂度(Oleft(Tmsqrt Alog m
ight))
5. CQOI2015 选数
求从(left[L,R
ight])中选N个数,其gcd等于K的方案数。(N,K,L,Rleq10^9),(R-Lleq10^5)
如果N个数互不相同,那么gcd至多是R-L,所以我们分情况讨论。
所以设(f(i))表示gcd是K*i的方案数,要求(leftlfloorfrac R{iK}
ight
floor-leftlfloorfrac{L-1}{iK}
ight
floor>1)
最后再加上([Lleq Kleq R])
时间复杂度(Oleft((R-L)log K
ight))