Min_25筛
例题题面
(f(x))是一个积性函数,且(f(p^k)=p^k(p^k-1)),求(sum_{i=1}^n f(i)),其中(nleq 10^{10})。
题解
Min_25筛的基本思想:积性函数(f(p^k))能表示成一个关于(p^k)的多项式,于是可以对每一项分别去处理。在此题中是一个二次的多项式。所以说,我们接下来的过程其实是在求这样一个式子:
其中的(f)和(k)均有别于上面的(f)和(k)
我们考虑将原式分成两部分:
其中前面那部分是质数,后面那部分是枚举合数。
我们先考虑第一部分怎么解决。
Part1
我们考虑一个dp:设(g(n,j)),满足:
其中显然的,(i^k)是一个完全积性函数。
在此题中,明显的,(k)为(1)或(2)。
接下来考虑转移,我们可以发现,如果从(g(n,j-1))转移到(g(n,j)),我们就要删掉原本最小质因子是(p_{j})的数,那么就有下面的转移:
其中前面那个就是最小质因子是(p_j)的所有数和质数,后面那个就是为了抵消掉质数。
不难发现,(g(p_{j-1},j-1))即为前(j-1)个质数的(k)次方和,这个可以筛法搞一下,记为(sp_{j-1})。
于是,我们就能求出(1)~(n)中所有质数的k次方和,即为(g(n,x)),其中(x)是满足(p_xleq sqrt n)的最大的(x)。为方便记为(g(n))。
但是你会发现一个事儿,(n)太大,没办法把每一个(g(n))都存下来。但是我们发现,我们需要的(n)都是由(n)除以某个数得到的,不难发现这样的值最多只有(O(sqrt n))种,于是就可以存下来了。
Part2
类似地考虑dp,设(S(n,x))为(1)到(n)中所有最小质因子大于(p_x)的数的函数(即(f))值之和,那么答案就是(S(n,0)+1)。(1为(f(1))的值)
将(S)分成两部分,一部分为质数,一部分为合数,则有:
前面那一半就是质数,后面的和式就是合数了。这个类似于上面(g)那条式子。后面那个(e eq1)是因为(e=1)的时候在质数里算过了。
这个式子就可以递归去处理了。
经典trick
因为在处理(g)的时候,减去(p_j^k(g(frac{n}{p_j},j-1)-g(p_{j-1},j-1)))意义即为将最小质因数为(p_j)的合数的函数值给去掉,所以这一部分的和就是全部合数的函数值的和。
例:【51NOD1847】奇怪的数学题