杜教筛

去年暑假学的,但是当时显然学的似懂非懂的。

希望求一个函数 f 的前缀和,考虑构造另一个函数 g 和它进行狄利克雷卷积的前缀和。

i=1n(fg)(i)=t=1ng(t)S(n)

考虑差分一下可以得到:

S(n)=i=1n(fg)(i)t=2ng(t)S(n)

然后后者是可以数论分块解决的。以 μ 为例,让 fμgI,有结论是说 fg=ε。然后就可以快速计算了。φ 也是一样的,考虑 φI=id,所以也是可以做的。然后做一下记忆化(然而好写这东西没什么用),筛出前 106 的前缀和可以加快计算速度。板子如下,不同的只是前面两个函数的计算方法不同。

unordered_map<int,int>fan;
inline int fg(int wh){return ;}
inline int sg(int l,int r){return ;}
int solve(int wh){
	if(wh<N)return sf[wh];
	if(fan[wh])return fan[wh];
	int an=fg(wh);
	for(int l=2,r=0;l<=wh;l=r+1){
		r=wh/(wh/l);
		an-=sg(l,r)*solve(wh/l);
	}
	return fan[wh]=an;
}

然后就可以解决 模板题 了。然后在另外一道题中我们需要计算的是 φ(i)i2

f=φ(i)id2,g=id2,思考他们狄利克雷卷积的结果。

k|nφ(k)k2(nk)2=k|nφ(k)n2=n3

所以就可以构造 fg=id3,然后杜教筛解决啦。

posted @   Feynn  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示