[笔记] 杜教筛

杜教筛#

用来在非线性时间内求积性函数前缀和

设现在要求积性函数 f 的前缀和, 设 i=1nf(i)=S(n)

再找一个积性函数 g ,则考虑它们的狄利克雷卷积的前缀和

i=1n(fg)(i)

=i=1nd|if(d)g(id)=d=1ng(d)i=1ndf(i)=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 ,使得可以快速算出 i=1n(fg)(i)g 的前缀和,便可以用数论分块递归地求解。

inline int F_sum(int n){
	if(n <= 5e6) return f[n];
	int &sum = n <= m ? F[n] : F[m + ::n / n];
	if(sum) return sum; sum = FG_sum(n);
	for(int l(2), r; l <= n; l = r + 1)
		r = n / (n / l), sum -= (G_sum(r) - G_sum(l - 1)) * F_sum(n / l);
	return sum;
}

技巧#

  • 记忆化:

    上面的求和过程中出现的都是 ni 。开一个大小为两倍 n 的数组 dp 记录答案。

    xn ,返回 dp[x] ,否则返回 dp[sqrt n + n / x] 即可。

  • 杜教筛的重点是对于要求的 f,找到 (fg),满足 g,(fg) 的前缀和都很好求出,如果没办法背下常见的狄利克雷卷积结果,不妨直接枚举几个情况试试,来两例子:

    • f(n)=μ(n)n2,g(n)=n2,(fg)(n)=[n=1]
    • f(n)=φ(n)n2,g(n)=n2,(fg)(n)=n3

题单#

DZY Loves Math IV

开始在想能不能把 i 和 j 分开

因为 n105,m109,所以比较自然地想到枚举 n 去求解,然后开始考虑对某一个 n 怎么处理。

因为 φ 函数的一些性质:n=i=1qpici,φ(n)=φ(i=1qpi)i=1qpici1

考虑先把 n 的质因数次数高于一次的部分都提出来,记为 x,剩下的 nx 记为 y.

i=1mφ(ni)=xi=1mφ(yi)=xi=1mφ(ygcd(y,i))φ(i)gcd(y,i)=xi=1mφ(ygcd(y,i))φ(i)jgcd(y,i)φ(j) ( n=inφ(i))=xi=1mφ(i)jgcd(y,i)φ(yj) ( y y  gcd(y,i) )=xi=1mφ(i)jy,jiφ(yj) ()=xjyφ(yj)i=1mjφ(ji) ()

总之记忆化后,复杂度是对的.

posted @   IrisT  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示
主题色彩