神秘技巧:O(n lnln n) 的dirichlet卷积
要求其中一个是积性函数,另一个可以任意。
其实就是在质因数分解的意义下做高维前缀和。
高维前缀和
对于二维前缀和,我们也许可以直接推 s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]
而我们也可以
s[i][j]=s[i][j-1]+a[i][j]
然后
s[i][j]=s[i-1][j]+a[i][j]
以实现二维的前缀和。
换句话说我们可以先枚举维,然后对每一维做前缀和。
这里咋做
我们设 是那个积性函数, 是任意的。
首先我们枚举“维”。维是啥?自然就是每个质数
注意到一个积性函数在 处的值是不确定的。我们需要枚举它,相当于钦点 的次数。然后做一个如下操作:
。
注意到这里钦点 是指恰好 那里的 就是 次。所以我们需要倒着枚举 ,类似背包的考虑,否则会导致重复贡献。
然后就枚举质数 ,倒着枚举 ,枚举 ,做一个前缀和就行了。
这样的复杂度据说是 的。实际跑出来也比 快很多。
特殊情况
如果 是完全积性函数,那你只需要这样做:
for(p: primes)
{
for(int i=1;i<=n/p;++i)
{
g[i*p]+=g[i]*f[p];
}
}
同样是 ,常数略小些。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】