【学习笔记】狄利克雷前/后缀和/差分

Page Views Count

概述#

定义约数求和为:

f(n)=dng(d)

也就是 f=gI,容易反演得到:

g(n)=dnμ(nd)f(d)

称上面形式为约数差分,即约数求和的逆运算。

定义倍数求和为:

f(n)=ndg(d)

容易发现约数求和等价于 f=Ag,其中 A 是矩阵,f,g 均为列向量。注意到 Ai,j=[ji],而倍数求和对应出 f=BgBi,j=[ij],也就是 B=AT

矩阵转置的逆等于矩阵逆的转置,因此 Ai,j1=μ(ij)[ji],可以推得 Bi,j1=μ(ji)[ij],因此:

g(n)=ndμ(dn)f(d)

称上面形式为倍数差分,即倍数求和的逆运算。

如何 O(nloglogn) 计算#

类似高维前缀和,把每个质数 p 设为一维,狄利克雷前缀和即求约数求和:

for(int i=1;i<=pr[0];++i){
    for(int j=1;j<=lim/pr[i];++j){
        a[j*pr[i]]+=a[j];
    }
}

同理狄利克雷后缀和即求倍数求和:

for(int i=1;i<=pr[0];++i){
    for(int j=lim/pr[i];j>=1;--j){
        a[j]+=a[j*pr[i]];
    }
}

之后狄利克雷前缀差分即求约数差分,本质是逆运算,和 μ 无关:

for(int i=1;i<=pr[0];++i){
    for(int j=lim/pr[i];j>=1;--j){
        a[j*pr[i]]-=a[j];
    }
}

同理狄利克雷后缀差分即求倍数差分:

for(int i=1;i<=pr[0];++i){
    for(int j=1;j<=lim/pr[i];++j){
        a[j]-=a[j*pr[i]];
    }
}

差分和求和的第二维枚举顺序显然相反,求和的枚举顺序可以轻松手动得到。

复杂度分析类似埃式筛,质数位置的倒数求和是 O(nloglogn) 的。

参考资料#

作者:SoyTony

出处:https://www.cnblogs.com/SoyTony/p/Learning_Notes_about_Dirichlet_Prefix_or_Suffix_Sum_or_Difference.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   SoyTony  阅读(443)  评论(7编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示