把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

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 \]

然后就做完了。

U540870

posted @ 2026-07-19 22:28  high_skyy  阅读(3)  评论(0)    收藏  举报
动态线条
动态线条end
浏览器标题切换
浏览器标题切换end
💬 加载中……