原题链接
参考资料
题意简述
给定 T 次询问,每次询问一个正整数 n,求最小的正整数 i 使得 σ(i)=n。
其中 σ(i) 表示 i 的所有正因子的和。
解题思路
显然有 σ(n)≥n,因此只需要考虑 i≤n 的情况即可。
无论采用哪种方法,整体思路都是:
- 预处理区间 [1,108] 内所有整数 i 的因子和 σ(i)。
- 在预处理的过程中,为每一个 σ(i) 记录其对应的最小整数 i。
- 利用预处理结果快速解答所有查询。
朴素算法
分别计算每个数的 σ(i):枚举 i 以内的所有因子 d,因为如果 d 是 i 的因子,则 di 也是 i 的因子。
时间复杂度 O(T+nn),不能通过此题。
Dirichlet 前缀和
注意到 σ(i) 是 id(i) 的和函数,因此可以使用 Dirichlet 前缀和 进行计算。
时间复杂度 O(T+nloglogn),实际用时约 6.2s。
线性筛
初始化 σ(1)=1。对于每一个素数 p,有 σ(p)=p+1。
对于每一个数 n,当通过 n′×p1 的方式筛掉,分类讨论:
- 若 n′modp1=0:
根据约数和函数的性质:
σ(n)=i=1∏r(1+pi+pi2+⋯+piai−1+piai)
进一步化简:
σ(n)=(1+p1+p12+⋯+p1a1−1)σ(n′)(1+p1+p12+⋯+piai−1+p1a1)=f(n)σ(n′)f(n′)
同时维护一个辅助函数 f(n),表示 n 最小质因子 p1 的幂次和:
f(n)=1+p1+p12+⋯+p1a1−1+p1a1
- 否则 n′modp1