转载至https://blog.csdn.net/skywalkert/article/details/50500009
前置技能
积性函数的定义
- 若f(n)f(n)的定义域为正整数域,值域为复数,即f:Z+→Cf:Z+→C,则称f(n)f(n)为数论函数。
- 若f(n)f(n)为数论函数,且f(1)=1f(1)=1,对于互质的正整数p,qp,q有f(p⋅q)=f(p)⋅f(q)f(p⋅q)=f(p)⋅f(q),则称其为积性函数。
- 若f(n)f(n)为积性函数,且对于任意正整数p,qp,q都有f(p⋅q)=f(p)⋅f(q)f(p⋅q)=f(p)⋅f(q),则称其为完全积性函数。
积性函数的性质与例子
狄利克雷卷积与莫比乌斯反演
ACM赛题是需要这种技巧在低于线性时间的复杂度下解决一类积性函数的前缀和问题。
首先看一个简单的例子,求前nn个正整数的约数之和,即,其中。
显然不能直接做了,但是我们可以推导一番:
如果能通过狄利克雷卷积构造一个更好计算前缀和的函数,且用于卷积的另一个函数也易计算,则可以简化计算过程。例如上题就是利用了的性质,但一定注意,不是所有的这一类题都只用配个恒等函数II就可以轻松完事的,有时需要更细致的观察。
但是注意到这种方法的常数与复杂度都可能较高,有时候可能再进行一些推导可以得到一个不使用正文方法的做法,例如ZOJ 3881 - From the ABC conjecture,本文的方法与网上一个解法类似,可以用于求解此题,但是可以这样推导之后得到更简单的一个做法。
需要使用此种方法的题目一般数据规模较大,例如,但是并不是都要使用此类方法,有时候可能存在其他O()的做法,例如51Nod 1222 - 最小公倍数计数,会利用正文复杂度分析的方法即可,再例如ZOJ 5340 - The Sum of Unitary Totient
推荐题目
这里给出一些练手的题目供大家理解上述方法,这类题还是较少的,如有其他题的题源欢迎分享。
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 - 奇怪的数学题(非常规积性函数求和,综合题,可分段打表)