浅谈一类积性函数的前缀和
写在前面
笔者在刷题过程中遇到一些求积性函数前缀和的问题,当中有一类问题须要在低于线性时间复杂度的算法,今天就来浅析一下这类问题的求解方法。当作以后讲课使用的讲义。若之后有了新的研究,再来继续完好这篇文章。
本文会随时更新内容。建议以链接形式转载,或者与笔者保持联系。
爬虫转载不标明出处必究。
author: skywalkert
original article: http://blog.csdn.net/skywalkert/article/details/50500009
last update time : 2017-04-01
前置技能
积性函数的定义
- 若
f(n) 的定义域为正整数域,值域为复数。即f:Z+→C ,则称f(n) 为数论函数。 - 若
f(n) 为数论函数。且f(1)=1 ,对于互质的正整数p,q 有f(p⋅q)=f(p)⋅f(q) ,则称其为积性函数。 - 若
f(n) 为积性函数,且对于随意正整数p,q 都有f(p⋅q)=f(p)⋅f(q) 。则称其为全然积性函数。
积性函数的性质与样例
- 常见的积性函数有
- 除数函数
σk(n)=∑d|ndk ,表示n 的约数的k 次幂和,注意σk(n) 与σk(n) 是不同的。 - 约数个数函数
τ(n)=σ0(n)=∑d|n1 ,表示n 的约数个数,一般也写为d(n) 。 - 约数和函数
σ(n)=σ1(n)=∑d|nd ,表示n 的约数之和。 - 欧拉函数
φ(n)=∑ni=1[(n,i)=1]⋅1 ,表示不大于n 且与n 互质的正整数个数,另外∑ni=1[(n,i)=1]⋅i=n⋅φ(n)+[n=1]2 ,且对于正整数n>2 来说φ(n) 是偶数。 - 莫比乌斯函数
μ(n) ,在狄利克雷卷积的乘法中与恒等函数互为逆元。μ(1)=1 ,对于无平方因子数n=∏ti=1pi 有μ(n)=(−1)t ,对于有平方因子数n 有μ(n)=0 。 - 元函数
e(n)=[n=1] ,狄利克雷卷积的乘法单位元,全然积性。 - 恒等函数
I(n)=1 ,全然积性。 - 单位函数
id(n)=n 。全然积性。 - 幂函数
idk(n)=nk ,全然积性。
- 除数函数
- 关于莫比乌斯函数和欧拉函数有两个经典的公式
[n=1]=∑d|nμ(d) 。将μ(d) 看作是容斥的系数就可以证明。n=∑d|nφ(d) ,将in(1≤i≤n) 化为最简分数统计个数就可以证明。
- 若
f(n) 为积性函数。则对于正整数n=∏ti=1pkii 有f(n)=∏ti=1f(pkii) ;若f(n) 为全然积性函数,则对于正整数n=∏ti=1pkii 有f(n)=∏ti=1f(pi)ki 。
狄利克雷卷积与莫比乌斯反演
- 数论函数
f 和g 狄利克雷卷积定义为(f∗g)(n)=∑d|nf(d)⋅g(nd) ,狄利克雷卷积满足交换律、结合律。对加法满足分配律,存在单位元函数e(n)=[n=1] 使得f∗e=f=e∗f ,若f 和g 为积性函数则f∗g 也为积性函数。 - 狄利克雷卷积的一个经常使用技巧是对于积性函数
f 与恒等函数I 的卷积的处理,比如n=∏ti=1pkii,g(n)=∑d|nf(d) ,则有g(n)=∏ti=1∑kij=0f(pji) 。 - 莫比乌斯反演也是对于
g(n)=∑d|nf(d) 的讨论。可是不要求f 是积性函数,适用于已知g(n) 求f(n) 的情况,因为I∗μ=e ,则g∗μ=f∗I∗μ=f∗e=f ,即f(n)=∑d|ng(d)⋅μ(nd) ,相似地有g(n)=∑n|df(d)⇒f(n)=∑n|dg(d)⋅μ(dn) ,二项式反演也是相似的技巧。有一个样例能够看出欧拉函数和莫比乌斯函数之间的关系。因为∑d|nφ(d)=id(n) 。所以φ(n)=∑d|nμ(d)nd ,也即φ(n)n=∑d|nμ(d)d 。
正文:黑科技
这样的黑科技大概起源于Project Euler这个站点,由xudyh引入中国的OI、ACM界。眼下出现了一些OI模拟题、OJ月赛题、ACM赛题是须要这样的技巧在低于线性时间的复杂度下解决一类积性函数的前缀和问题。
首先看一个简单的样例。求前
显然不能直接做了。可是我们能够推导一番:
当
相同地。求前
另外须要说明的是,
如今我们来加大一点难度,求前
眼下本文提到的有关欧拉函数的公式仅仅有几个,能否用它们来帮助化简呢?答案是肯定的。接下来我们就利用
这个公式也能够看成是
那么仅仅要计算出
如果计算出
因为
之前利用
如果能通过狄利克雷卷积构造一个更好计算前缀和的函数。且用于卷积的还有一个函数也易计算,则能够简化计算过程。比如上题就是利用了
定义梅滕斯函数
有了欧拉函数的经验,这次似乎就轻车熟路了吧,使用
因此
看了上面的样例,是不是觉得这样的做法非常naive,非常好学啊。再来看一个题吧!
令
先做一番化简,变成积性函数前缀和的样子:
设
因此要求的是
而对于
可是不难发现
因此
可是注意到这样的方法的常数与复杂度都可能较高,有时候可能再进行一些推导能够得到一个不使用正文方法的做法,比如ZOJ 3881 - From the ABC conjecture,本文的方法与网上一个解法相似,能够用于求解此题。可是能够这样推导之后得到更简单的一个做法。
须要使用此种方法的题目一般数据规模较大,比如
推荐题目
这里给出一些练手的题目供大家理解上述方法,这类题还是较少的,如有其它题的题源欢迎分享。
51Nod 1244 - 莫比乌斯函数之和
51Nod 1239 - 欧拉函数之和
BZOJ 3944 - Sum
HDU 5608 - function
51Nod 1238 - 最小公倍数之和 V3
51Nod 1237 - 最大公约数之和 V3
51Nod 1227 - 平均最小公倍数
Tsinsen A1231 - Crash的数字表格
SPOJ DIVCNT2 - Counting Divisors (square)
51Nod 1222 - 最小公倍数计数(复杂度分析)
BZOJ 4176 - Lucas的数论
51Nod 1220 - 约数之和
51Nod 1584 - 加权约数和
ZOJ 3881 - From the ABC conjecture(不须要使用正文方法)
BZOJ 3512 - DZY Loves Math IV
ZOJ 5340 - The Sum of Unitary Totient(常规积性函数求和,数据组数较多,仅仅可分段打表)
SPOJ DIVCNT3 - Counting Divisors (cube)(常规积性函数求和,注意代码长度限制,不可打表)
51Nod 1575 - Gcd and Lcm(常规积性函数求和。可分段打表)
51Nod 1847 - 奇怪的数学题(非常规积性函数求和,综合题,可分段打表)
Tips: 加粗内容为待更新内容。
浙公网安备 33010602011771号