1 条题解
-
0
自动搬运
来自洛谷,原作者为

joke3579
**搬运于
2025-08-24 23:15:11,当前版本为作者最后更新于2025-05-03 00:05:31,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
优化(?)自 NaCly_Fish 题解。
根据基础数论知识, 当且仅当 ,进一步地,其等价于 。从而我们需要计算的就是
$$\sum_{i = 1}^n \dfrac{[\gcd(i, p) = 1]}{i} = \sum_{i = p\lfloor n/p\rfloor}^n \dfrac{[\gcd(i, p) = 1]}{i} + \sum_{t = 0}^{p - 1} [\gcd(t, p) = 1] \sum_{i = 0}^{\lfloor n/p\rfloor - 1} \dfrac{1}{ip + t} $$前半部分可以直接枚举 计算,只需要考虑后半部分。
通过二项式展开,我们可以将 视为以 为形式变元的幂级数,而 的条件只是将幂级数在 次幂处截断为多项式,并给了多项式的系数一个模数。那么不妨枚举与 互质的 (这也指出 自然有逆),考察截断在 次项的多项式
$$F_{t,n}(x) = \sum_{i = 0}^{n} \dfrac{1}{ix + t} = \dfrac{1}{t} \sum_{j = 0}^{k - 1} (-x/t)^j\sum_{i = 0}^{n} i^j $$我们需要的 中 都相同,那么如果预处理了指数为 的自然数幂和,我们就能对任意 以 的复杂度计算 。这是简单的:我们已经知道了
$$\sum_{i = 1}^n i^k = \sum_{i = 0}^k {k\brace i} \dfrac{(n + 1)^{\underline{i + 1}}}{i + 1} $$再注意到 这 个数中有且仅有一个数是 的倍数,我们就能 地预处理下降幂的部分,从而 计算出每个需要的自然数幂和。到这里,我们就能 计算第二部分了。
最后是一些保证复杂度的实现细节:求逆可以用非递归 exgcd 实现,单次复杂度 ,而且可以减少很多常数;第一部分可以简单做到 ,只需按照一次求逆求乘法逆元的方式写; 和 都是积性的,可以线性筛出来,复杂度是至多 的。
总时间复杂度 。
- 1
信息
- ID
- 10913
- 时间
- 2500ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者