杜教筛

  • 杜教筛是用来在非线性时间内求积性函数的前缀和

前置知识

  • 积性函数(莫比乌斯函数,欧拉函数。。。)

  • 狄利克雷卷积

杜教筛

  • 假设当前要求积性函数的 i=1nfi

  • 那么我们找一个合适的另一个积性函数 g

i=1n(fg)(i)=i=1nd|if(d)g(id)=d=1ng(d)i=1ndfi=d=1ng(d)S(nd)

  • 那么 g(1)S(n)=i=1ng(i)S(ni)i=2ng(i)S(ni)

  • 那么 g(1)S(n)=i=1n(fg)(i)i=2ng(i)S(ni)

  • 最后这个式子可以当作一个 公式

  • 所以现在就需要找到一个合适的积性函数 g 使得可以快速的求出这两个部分,后面的部分可以用数论分块优化,前面的部分一般可以 O(1)

  • 那么一般的复杂度就是 O(n34) ,如果预处理出长度为 n23 的前缀和,那么可以证明复杂度为 O(n23)

  • 还有的优化就是在递归的时候记忆化

  • P4213 【模板】杜教筛(Sum)

  • 代码

P3768 简单的数学题

  • 首先转换成 x=1nx3d=1nxμ(d)d2g(ndx),g(x)=((1+x)x2)2

  • 这里有个套路,设 T=dx ,把 g 提前

  • 因为我们需要构造出我们熟悉的数论函数,所以这个和 μ 函数连在一起的分块结构必须分离

  • T=1ng(nT)×T2d|Tμ(T)(Td)

  • 将后面的一坨看成 f(x) ,那么就是 T=1ng(..)×f(T)

  • 前面的部分可以用数论分块优化,后面的 f 考虑用非线性的杜教筛

  • 对于 f(x)=x2d|xμ(x)(xd)=x2φ(x)

  • 考虑找一个积性函数,最好将 φ 变成 id ,所以需要先将 x2 消掉,设 h(x)=x2

  • 那么 (fh)(x)=x2d|xφ(d)=x3

  • 那么就可以直接套杜教筛,S(n)=i=1ni3i=2ni2S(ni)

  • i=1ni3=n2(n+1)24i=1ni2=n(n+1)(2n+1)6 ,那么整体的复杂度就可以做到 n23

  • 虽然外层套了层数论分块,但是我们记忆化了,最后只会有 n 个点值会被算到,所以整体的复杂度在里面的杜教筛,所以可以看成 O(n+n23)

posted @   Kzos_017  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示