杜教筛&套路总结

杜教筛

\[\begin{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\)

\[\begin{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】神犇与蒟蒻

posted @ 2018-11-24 10:32  Emiya_2020  阅读(195)  评论(0编辑  收藏  举报