Dirichlet 前缀和 复习笔记
题目概述
求:
\[b_k=\sum_{d\mid k} a_d
\]
要求:\(n\leq 2\times 10^7\)。
分析
不难想到枚举 \(d\) 然后对它的倍数进行加和,但这个时间复杂度是 \(\mathcal{O}(n\ln n)\) 的,过不了。
考虑到每个数都可以质因数分解,因此我们用类似于SOSdp的做法把素数看作第几位,然后直接加和即可:
for (int i = 1;i <= cnt;i ++)
for (int j = 1;j * prime[i] <= n;j ++)
a[prime[i] * j] += a[j];
时间复杂度 \(\mathcal{O}(\sum_{p\in Prime}\lfloor\frac n p\rfloor)=\mathcal{O}(n\log \log n)\),可以通过。
同类练习题
U540632
求:
\[b_k=\sum_{i=1}^ka_{\lfloor\frac k i\rfloor}
\]
感觉好难想啊。
首先令 \(f_i=a_i-a_{i-1},f_1=a_1\),那么:
\[S=\sum_{i=1}^k\sum_{d=1}^{\lfloor\frac k i\rfloor} f_i
\]
那么先枚举 \(d\) 则可以得到:
\[S=\sum_{t=1}^k\sum_{d\mid t}f_d
\]
然后就做完了。

浙公网安备 33010602011771号