1. 程式人生 > >莫比烏斯反演(大坑)

莫比烏斯反演(大坑)

前置技能

約定

  1. gcd(a,b)=(a,b)gcd(a,b)=(a,b)
  2. [a]={1,a=true0,a=false[a]=\begin{cases}1,a=true\\0,a=false\end{cases}

數論分塊

已知 n,kn,k,則暴力地求 S=i=1nniS=\sum\limits_{i=1}^n\Big\lfloor\dfrac ni\Big\rfloor 需要 O(n)O(n) 的時間。 把表 (k=10)(k=10) 列出來

i 1 2 3 4 5 6 7 8 9 10
n/(n/i) 10532211111

其實最多隻有 2n2\sqrt n 種取值。 設當前列舉的下標為 ii,當前位置的取值為 ni\Big\lfloor\dfrac ni\Big\rfloor,則相同取值的最右端點下標為 nni\Bigg\lfloor\dfrac n{\big\lfloor\frac ni \big\rfloor}\Bigg\rfloor。 因而可以寫出如下程式碼:

for(int l=1,r;l<=n;l=r+1){
    r=n/(n/l);
    ans+=(
r-l+1)*(n/l); }

時間複雜度O(n)O(\sqrt n) 如果是求 S=i=1nkiS=\sum\limits_{i=1}^n\Big\lfloor\dfrac ki\Big\rfloor 呢?計算右端點時特判一下是否越界即可。

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);
}

積性函式

例子

  1. 常函式 1(n)=11(n)=1
  2. 單位元 e
    (n)={1,n=10,n̸=1e(n)=\begin{cases}1,n=1\\0,n\not=1\end{cases}
  3. 約數個數函式 d(n)=xn1d(n)=\sum\limits_{x|n}1
  4. 約數和函式 σ(n)=xnxσ(n)=\sum\limits_{x|n}x
  5. 約數k次冪函式 σk(n)=xnxkσ_k(n)=\sum\limits_{x|n}x^k
  6. 尤拉函式 φ(n)=1n[(i,n)=1]\varphi(n)=\sum\limits_{1}^n[(i,n)=1]
  7. 莫比烏斯函式 μ(x)={1,x=1(1)k,x=p1p2...pk,pi̸=pj(pix)0,others\mu(x)=\begin{cases}1,&amp; x=1\\(-1)^{k},&amp; x=p_1p_2...p_k,\forall\ p_i\not=p_j( p_i 為 x 的唯一分解)\\0,&amp; others\end{cases}
  8. id(n)=nid(n)=n

性質

如果 ffgg 是積性函式,則下列函式也是積性函式。

  1. h(x)=f(xp)h(x)=f(x^p)
  2. h(x)=fp(x)h(x)=f^p(x)
  3. h(x)=f(x)g(x)h(x)=f(x)g(x)
  4. h(x)=dxf(d),g(xd)h(x)=\sum\limits_{d|x}f(d),g(\dfrac xd)(狄利克雷卷積)

部分積性證明

尤拉函式

結論:若(n,m)=1(n,m)=1,則φ(nm)=φ(n)φ(m)\varphi(nm)=\varphi(n)\varphi(m) 先說一下,網上那些根據通式證明的大多都是錯的,因為通式需要積性證明。 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…

篩積性函式

尤拉函式

尤拉函式有下面的性質。 1.1.\quadmprime,n0(modm)m\in prime,n≡0 \pmod mφ(n×m)=φ(n)×m\varphi(n\times m)=\varphi(n)\times m KaTeX parse error: No such environment: equation at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \begin{align… 2.2.\quadpprime,i̸0(modp)p\in prime,i\not≡0 \pmod pφ(i×p)=φ(i)×(p1)\varphi(i\times p)=\varphi(i)\times (p-1) 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 卷積

定義

定義兩個數論函式 f,gf,g 的Dirichlet卷積為 (fg)(n)=dnf(n)d(nd)(f*g)(n)=\sum\limits_{d|n}f(n)d(\dfrac nd) 其中它的單位元為

性質

  1. fg=gff*g=g*f
  2. (fg)h=f(gh)(f*g)*h=f*(g*h)
  3. h(f+g)=hf+hgh*(f+g)=h*f+h*g