杜教筛
用处
杜教筛是在非线性时间内处理积性函数的前缀和
积性函数
积性函数:对于任意互质的整数
完全积性函数:对于任意整数 a,b 有
常见的积性函数:
狄利克雷卷积
设
性质:满足交换律,结合律
单位元:
结合狄利克雷卷积得到的几个性质:
-
\mu$ ∗ $I = \epsilon $ , $ (\sum_{d|n}\mu(d)=1,n=1) -
\varphi * I = id$ , $(\sum_{d|n}\varphi(d)=n) -
\mu * id = \varphi$ , $ (\dfrac{\varphi(n)}{n}=\sum_{d|n} \dfrac{\mu(d)}{d})
杜教筛
可得出
所以现在如果可以找到一个合适的积性函数
模板
long long get_mu(int n)
{
if(n<=maxn)
return mu[n];
if(Smu[n])
return Smu[n];
long long res=1ll;
for(int l=2,r;l<=n;l=r+1){
r=n/(n/l);
res-=(r-l+1)*get_mu(n/l);
}
return Smu[n]=res;
}
long long get_phi(int n)
{
if(n<=maxn)
return phi[n];
if(Sphi[n])
return Sphi[n];
long long res=1ll*n*(n+1)/2;
for(int l=2,r;l<=n;l=r+1){
r=n/(n/l);
res-=(r-l+1)*get_phi(n/l);
}
return Sphi[n]=res;
}