标签:class 求和 .com 欧拉 zoj var rac spl cpp
\[ \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()\)的前缀和。
由\((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;
}
例题
由\((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;
}
例题
标签:class 求和 .com 欧拉 zoj var rac spl cpp
原文地址:https://www.cnblogs.com/Emiya-wjk/p/10011240.html