Divisor Summatory Function / DSF:
T(n)=n∑i=1⌊ni⌋
如何求一行 T(n)?考虑组合意义,对于每个 i 实际上计算了它不大于 n 的倍数个数,于是枚举这个倍数可以得到
T(n)=n∑i=1σ0(i)
另一种方式是考虑差分:
T(n)−T(n−1)=n∑i=1⌊ni⌋−n−1∑i=1⌊n−1i⌋=n∑i=1(⌊ni⌋−⌊n−ii⌋)=n∑i=1[i∣n]=σ0(n)
定义广义 DSF:
F(n)=n∑i=1f(i)⌊ni⌋
如何求一行 F(n)?仍然考虑差分:
F(n)−F(n−1)=n∑i=1f(i)⌊ni⌋−f(i)n−1∑i=1⌊n−1i⌋=n∑i=1f(i)(⌊ni⌋−⌊n−ii⌋)=n∑i=1f(i)[i∣n]=∑d∣nf(d)
这表明 F=∑(f∗1)(x)δx .
因为假设是要求一行所以就认为前缀和是 Θ(n) 的,那么 Dirichlet 前缀和可以 Θ(nloglogn),于是广义 DSF 求一行就可以 Θ(nloglogn) 解决,前提是 f 可以在不高于 Θ(nloglogn) 复杂度求一行 .
其实非常显然,组合意义做这个也是一样的 .
一些示例:
Koishi 的数学题
给一个 n,令 f(x)=n∑i=1xmodi,求 f(1…n) .
1≤n≤107 .
取模比较经典:
f(x)=n∑i=1xmodi=nx−n∑i=1i⌊xi⌋
右边是广义 DSF 形式,于是可以立即得到右边就是 x∑i=1σ1(i) ,
线性筛求 σ1 然后递推即可,时间复杂度 Θ(n) .
Koishi 的多项式
给两个正整数 n,m 和一个 m 次多项式 f(x) .
令 g(x)=n∑i=1f(i)(xmodi),求 f(1…n),答案对 998244353 取模 .
1≤n,m≤5×104 .
类似 Koishi 的数学题:
g(x)=nxn∑i=1f(i)−n∑i=1if(i)⌊xi⌋
左边可以 Θ(mlog2m) 求,也可以用神奇方法做到 Θ(mlogm):
神奇方法
注意到 nx 是常数不用管,于是就是要求 n∑i=1f(i) .
令 f 的系数序列为 {am},则就是要求
m∑i=0ain∑j=1ji
可以考虑先对于每个 i 计算 g(i)=n∑j=1ji 然后 Θ(m) 统计 .
为了方便先让下标从 0 开始:g(i)=n∑j=0ji .
写出其 EGF:
G(x)=∑z≥1g(z)xzz!=∑z≥1n∑j=0jzxzz!=n∑j=0ejx=1−enx1−ex
这样就可以 Θ(mlogm) 求了 .
右边就是广义 DSF,立得右边就是
h(x)=∑d∣xd⋅f(d)
多点求值后就是 Dirichlet 前缀和,多点求值复杂度太高了所以 Dirichlet 前缀和基本咋写都行 .
总时间复杂度 Θ(nlog2n+mlog2m) .
有可能施 Bell 级数科技可以变成单 log(?
大概就这些了 .
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】