莫比烏斯反演(大坑)
阿新 • • 發佈:2018-12-10
前置技能
約定
數論分塊
已知 ,則暴力地求 需要 的時間。 把表 列出來
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
n/(n/i) | 10 | 5 | 3 | 2 | 2 | 1 | 1 | 1 | 1 | 1 |
其實最多隻有 種取值。 設當前列舉的下標為 ,當前位置的取值為 ,則相同取值的最右端點下標為 。 因而可以寫出如下程式碼:
for(int l=1,r;l<=n;l=r+1){
r=n/(n/l);
ans+=( r-l+1)*(n/l);
}
時間複雜度 如果是求 呢?計算右端點時特判一下是否越界即可。
for(int l=1,r;l<=n;l=r+1){
if(l>k) r=n;//超過k的部分取值相同,均為0
else r=min(n,k/(k/l));//防止越過n
ans+=(long long)(k/l)*(r-l+1);
}
積性函式
例子
- 常函式
- 單位元
- 約數個數函式
- 約數和函式
- 約數k次冪函式
- 尤拉函式
- 莫比烏斯函式
性質
如果 和 是積性函式,則下列函式也是積性函式。
- (狄利克雷卷積)
部分積性證明
尤拉函式
結論:若,則 先說一下,網上那些根據通式證明的大多都是錯的,因為通式需要積性證明。 KaTeX parse error: No such environment: equation at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \begin{aligned…
莫比烏斯函式
KaTeX parse error: No such environment: equation at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \begin{align…
篩積性函式
尤拉函式
尤拉函式有下面的性質。 若 則 KaTeX parse error: No such environment: equation at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \begin{align… 若 則 KaTeX parse error: No such environment: split at position 14: \qquad \begin{̲s̲p̲l̲i̲t̲}̲ 證明:&\because 歐… 程式碼:
void euler_phi(int n){
memset(phi,0,sizeof phi);//尤拉函式表
memset(vis,0,sizeof vis);//是否是質數
int tot=0;phi[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){//找到質數
prime[++tot]=i;//儲存質數
phi[i]=i-1;//質數的尤拉函式為它自身減1
}
for(int j=1;j<=tot&&i*prime[j]<=n;j++){
vis[i*prime[j]]=1;//篩去合數
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];//性質1
break;//繼續下去沒有意義,見尤拉篩法
}else
phi[i*prime[j]]=phi[i]*(prime[j]-1);//性質2
}
}
}
莫比烏斯函式
void euler_mu() {
memset(mu,0,sizeof mu);//莫比烏斯函式表
memset(vis,0,sizeof vis);//是否是質數
mu[1]=1;//特判
for(int i=2;i<=n;++i) {
if(!vis[i]) p[++tot]=i,mu[i]=-1;//是質數
for(int j=1;j<=tot&&i*p[j]<=n;++j) {
vis[i*p[j]]=1;
if(i%p[j]==0) {
mu[i*p[j]]=0;//有完全平方因子
break;
}
mu[i*p[j]]=-mu[i];//積性函式(p是質數,mu[p]=-1)
}
}
}
Dirichlet 卷積
定義
定義兩個數論函式 的Dirichlet卷積為 其中它的單位元為