杜教筛&套路总结

杜教筛

[egin{split} (g*f)(i)&=sum_{d|i}g(d)f(frac id)\ Rightarrow g(1)S(n)&=sum_{i=1}^n(g*f)(i)-sum_{i=2}^ng(i)S(frac ni) end{split} ]

其中,(S(x))(f())的前缀和。


套路一:(mu)

((1*mu)=e),取(g(x)=1)

[egin{split} S(n)=1-sum_{i=2}^nS(frac ni) end{split} ]

可以用线性筛预处理一部分(mu)的前缀和,剩下的用杜教筛记忆化搜索即可。

int Smu(int x){
	if(x<=M)return mu[x];
	if(smu[x])return smu[x];
	int ret=1;
	for(int l=2,r=0;r!=x;l=r+1){
		r=x/(x/l);
		ret-=1ll*(r-l+1)*Smu(x/l);
	}
	return smu[x]=ret;
} 

例题

【CQOI2015】选数

【BZOJ3944】Sum


套路2:(varphi)

((1*varphi)=Id),取(g(x)=1)

[S(n)=frac {n cdot (n+1)}2-sum_{i=2}^nS(frac ni) ]

LL Sphi(int x){
	if(x<=M)return phi[x];
	if(sphi[x])return sphi[x];
	LL ret=1ll*x*(1ll*x+1)/2;
	for(int l=2,r=0;r!=x;l=r+1){
		r=x/(x/l);
		ret-=1ll*(r-l+1)*Sphi(x/l);
	}
	return sphi[x]=ret;
} 

例题

【BZOJ4805】欧拉函数求和

【BZOJ3944】Sum


其他题目:

【BZOJ4916】神犇与蒟蒻

原文地址:https://www.cnblogs.com/Emiya-wjk/p/10011240.html