Project Euler 484 Arithmetic Derivative 算术导数 题解 (Powerful Number 筛)
先来观察一下"算术导数"\(a'\)
- 当\(a\)可以由两个质数\(p_1,p_2\)相乘得到时,\(a'=p_1+p_2\)。
- 当\(a\)可以由三个质数\(p_1,p_2,p_3\)相乘得到时,\(a'=p_1(p_2p_3)'+p_1'(p_2p_3)=p_1p_2+p_1p_3+p_2p_3\)
- 再往后推几项可知,令\(a=\prod_{i}p_i\)(\(p\)为质数,每种\(p_i\)可以出现多次),则\(a'=\sum_i \frac a{p_i}\)。
那么\(gcd(a,a')\)有什么性质呢?
先把\(a\)分解质因数,\(a=\prod_i^k p_i^{e_i}\),令\(a\)含有的质因数列表为\(p_1\cdots p_k\)(不重复)。发现\(a\)和\(a'\)一定有这个公因数:\(\prod p_i^{e_i-1}\)。把\(a\)除掉这个数,得到\(\prod p_i\);把\(a'\)除掉这个数,得到\(\sum_{i=1}^k \frac{\prod_j^k p_j}{p_i}\cdot e_i\)。如果这时的\(a\)和\(a'\)仍然有公因数,那这个公因数肯定是由\(p_1\cdots p_k\)中的质数组成的。枚举\(p_i\),我们检查\(a和a'\)是否有这个公因数。对于\(\sum_{i=1}^k \frac{\prod_j^k p_j}{p_i}\cdot e_i\),发现除了\(p_i\)所在的那一项,其他项都是\(p_i\)的倍数,所以这就要求\(\frac{\prod_j^k p_j}{p_i}\cdot e_i\)也是\(p_i\)的倍数,所以\(e_i\)得是\(p_i\)的倍数,这就是充要条件。
令\(f_a=gcd(a,a')=\prod_{i=1}^k p_i^{e_i-1+[p_i|e_i]}\)。我们要求的答案就是\(\sum_{i=2}^n f_i\)。注意到\(f\)是积性的,并且很容易构造出另一个易求前缀和的积性函数\(g\)满足对于所有质数\(p\),\(f_p=g_p\)(\(g=\{1,1,1,1,1\cdots\}\))。所以就可以用PN筛把\(f\)的前缀和直接筛出来。
PN筛应该是几种进阶筛法里最简单的一种了吧,看OIWiki十分钟就可以学会
时间复杂度\(O(\sqrt nlogn)\)。