杜教筛
[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;
}
例题
套路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;
}
例题
其他题目: