首先显然地,有答案为 n∑d=1f(d)(2⌊nd⌋∑i=1φ(i)−1)
杜教筛 / Min_25 筛一下,那么问题变为求 f(i) 的前缀和。
设 s(n)=n∑i=1f(i)。
观察到 f(n) 实际上并不好处理,考虑把那个 max(m−g(n)+1,0) 的系数处理一下: f(n)=m∑u=1[g(n)≤u]nk
但是 m 可能很大。
然而注意到 g(n)≤log2n,所以可以把 m 降到 O(logn) 级别,超出部分直接算一下自然数幂和即可。
则 s(n)=n∑i=1f(i)=n∑i=1m∑u=1[g(i)≤u]ik=m∑u=1n∑i=1[g(i)≤u]ik
考虑求 n∑i=1[g(i)≤u]ik。
这可以考虑容斥,即枚举某些质因子,使它们的指数强制超过 u。
则 n∑i=1[g(i)≤u]ik=⌊n1/(u+1)⌋∑p=1μ(p)⌊npu+1⌋∑i=1(ipu+1)k=⌊n1/(u+1)⌋∑p=1μ(p)p(u+1)k⌊npu+1⌋∑i=1ik
然后注意到 m∑u=1O(n1/(u+1))=O(√n),所以对于 u=1,…,m 如此计算一次的复杂度是 O(√n) 的。
另外可以通过线筛 g(n) 预处理出一定范围内的 s(n)。
于是根据杜教筛的思想,平衡至 O(n2/3) 即可。
不过还有一个问题,那就是计算自然数 k 次幂和。
这是一个经典问题,容易发现需要计算的位置只有 O(√n) 种,有很多方法可以做到 O(k2) 预处理后 O(k√n) 解决。
标程使用的是第二类斯特林数。
总复杂度 O(k2+k√n+n2/3)。
可能略微卡常。
代码:
1 |
|