莫比乌斯反演之随便写写...

莫比乌斯真的…难推…有时间…再推吧【捂脸】


#莫比乌斯函数

μ ( x ) = { 1 x = 1 ( − 1 ) k 每 个 因 子 最 多 只 出 现 一 次 ( 即 因 子 的 最 高 幂 指 数 为 1 ) 0 其 他 情 况 \mu(x)= \begin{cases} 1& x=1\\ (-1)^k& 每个因子最多只出现一次(即因子的最高幂指数为1)\\ 0 & 其他情况 \end{cases} μ(x)=1(1)k0x=1(1)


#莫比乌斯反演

莫比乌斯反演呢,其实说的就是 g ( n ) = ∑ d ∣ n μ ( n d ) f ( d ) = ∑ d ∣ n μ ( d ) f ( n d ) g(n)=\sum\limits_{d|n} {\mu(\frac{n}{d})f(d)}=\sum\limits_{d|n}\mu(d)f(\frac{n}{d}) g(n)=dnμ(dn)f(d)=dnμ(d)f(dn)
变下型就是 f ( k ) = ∑ x = 1 ⌊ n k ⌋ g ( k x ) ⇒ g ( k ) = ∑ x = 1 ⌊ n k ⌋ f ( k x ) μ ( d ) f(k)=\sum\limits_{x=1}^{\lfloor\frac{n}{k}\rfloor}{g(kx)}\Rightarrow g(k)=\sum\limits_{x=1}^{\lfloor\frac{n}{k}\rfloor}f(kx)\mu(d) f(k)=x=1kng(kx)g(k)=x=1knf(kx)μ(d)

μ \mu μ 这个可以通过预处理线性时间求出
就像这样 ↓ \downarrow

void mobius(){
	mu[1]=1;
	memset(notprime,false,sizeof(notprime));
	for(int i=2;i<=50000;i++){
		if(!notprime[i]) prime[++top]=i,mu[i]=-1;
		for(int j=1;j<=top && prime[j]*i<=50000;j++){
			notprime[prime[j]*i]=true;
			if(i%prime[j]==0){
				mu[i*prime[j]]=0;
				break;
			}mu[i*prime[j]]=-mu[i];
		}
}

那么说个小例子吧
1 &lt; = x &lt; = n , 1 &lt; = y &lt; = m 1&lt;=x&lt;=n,1&lt;=y&lt;=m 1<=x<=n1<=y<=m,求使 g c d ( x , y ) = k gcd(x,y)=k gcd(xy)=k的对数 (bzoj1101/lg3455)

我们设 g ( k ) g(k) g(k)表示 g c d ( x , y ) = k gcd(x,y)=k gcd(xy)=k的倍数的对数, f ( k ) f(k) f(k)表示 g c d ( x , y ) = k gcd(x,y)=k gcd(xy)=k的对数(即所求)
g ( k ) = ∑ x = 1 ⌊ n k ⌋ f ( k x ) g(k)=\sum\limits_{x=1}^{\lfloor\frac{n}{k}\rfloor}f(kx) g(k)=x=1knf(kx)
由莫比乌斯变形可以得到 f ( k ) = ∑ x = 1 ⌊ n k ⌋ g ( k x ) μ ( x ) f(k)=\sum\limits_{x=1}^{\lfloor\frac{n}{k}\rfloor}g(kx)\mu(x) f(k)=x=1kng(kx)μ(x)
又发现呢, g ( k ) g(k) g(k)可以求(不像 f ( k ) f(k) f(k) 哼)
因为,如果 g c d ( i , j ) = k gcd(i,j)=k gcd(ij)=k i = k x 1 , j = k x 2 i=kx_1,j=kx_2 i=kx1j=kx2,所以就求有多少对 ( x 1 , x 2 ) (x_1,x_2) x1x2即可
x 1 , x 2 x_1,x_2 x1x2都应当是k的倍数才有可能
所以 f ( k ) = ∑ x = 1 ⌊ n k ⌋ μ ( x ) ⌊ n k x ⌋ ⌊ m k x ⌋ f(k)=\sum\limits_{x=1}^{\lfloor\frac{n}{k}\rfloor}\mu(x)\lfloor\frac{n}{kx}\rfloor\lfloor\frac{m}{kx}\rfloor f(k)=x=1knμ(x)kxnkxm然后就可以求出来啦

当然…这个方法吧…不太适用【捂脸】…就是…不适用于大多数题
因此…还有另一个想法【捂脸】(是不是感觉很无奈 哎呀我也没办法~)
求的就是 ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = = k ] \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==k] i=1nj=1m[gcd(i,j)==k] ⇒ ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ [ g c d ( i , j ) = = 1 ] \Rightarrow\sum\limits_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{k}\rfloor}[gcd(i,j)==1] i=1knj=1km[gcd(i,j)==1]
也就是 g c d ( i , j ) = = 1 gcd(i,j)==1 gcd(i,j)==1时个数加一,就和 ε \varepsilon ε很像哦 ε ( x ) = { 1 x = 1 0 d e f a u l t ε(x) =\begin{cases} 1 &amp; x=1\\ 0 &amp; default\end{cases} ε(x)={10x=1default
因此所求就是 ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ ε ( g c d ( i , j ) = = 1 ) \sum\limits_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{k}\rfloor}\varepsilon(gcd(i,j)==1) i=1knj=1kmε(gcd(i,j)==1)
又因为 μ ∗ 1 = ε \mu * 1=\varepsilon μ1=ε
⇒ ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ m k ⌋ ∑ d ∣ g c d ( i , j ) μ ( d ) \Rightarrow \sum\limits_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{k}\rfloor}\sum\limits_{d|gcd(i,j)}\mu(d) i=1knj=1kmdgcd(i,j)μ(d)
⇒ ∑ d = 1 m i n ( ⌊ n k ⌋ , ⌊ m k ⌋ ) μ ( d ) ⌊ n k d ⌋ ⌊ m k d ⌋ \Rightarrow \sum\limits_{d=1}^{min(\lfloor\frac{n}{k}\rfloor,\lfloor\frac{m}{k}\rfloor)}\mu(d)\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor d=1min(knkm)μ(d)kdnkdm
就是这样【捂脸】

不过呢~
还可以更好哦~
可以分块【捂脸】
因为 ⌊ n k ⌋ \lfloor\frac{n}{k}\rfloor kn最多 n \sqrt{n} n 块, ⌊ m k x ⌋ \lfloor\frac{m}{kx}\rfloor kxm最多 m \sqrt{m} m
因此把每个相等的块( ⌊ n k ⌋ \lfloor\frac{n}{k}\rfloor kn ⌊ m k ⌋ \lfloor\frac{m}{k}\rfloor km相等)…找到这个块中对应的 μ \mu μ和(可通过前缀和求出)即可~

ll f(int n,int m,int k){
	if(n>m) swap(n,m);
	n/=k;m/=k;
	ll ans=0;
	for(int i=1,last=1;i<=n;i=last+1){
		last=min(n/(n/i),m/(m/i));
		ans+=(ll)(mu[last]-mu[i-1])*(m/i)*(n/i);
	}return ans;
}

扩展一下,a<=x<=b,c<=y<=d的时候呢

做法就是用容斥原理【捂脸】
结果就是 f ( b , d , k ) − f ( a − 1 , d , k ) − f ( b , c − 1 , k ) + f ( a − 1 , c − 1 , k ) f(b,d,k)-f(a-1,d,k)-f(b,c-1,k)+f(a-1,c-1,k) f(b,d,k)f(a1,d,k)f(b,c1,k)+f(a1,c1,k)


#狄利克雷卷积
还有一个比较有用的东西:狄利克雷卷积

狄利克雷卷积:对于函数 f , g f,g f,g ,定义它们的卷积为 f ( n ) ∗ g ) n ) = ∑ d ∣ n f ( d ) g ( n d ) f(n)∗g)n)=\sum\limits_{d|n}f(d)g(\frac{n}{d}) f(n)g)n)=dnf(d)g(dn)

主要记住几个就可以了
μ ∗ 1 = ε \mu*1=\varepsilon μ1=ε
φ ∗ 1 = i d \varphi*1=id φ1=id
i d ∗ μ = φ id*\mu=\varphi idμ=φ
i d ∗ 1 = σ id*1=\sigma id1=σ


#积性函数

有这样一些性质

  • f ( x ) f(x) f(x) 定义域为正整数,满足如果 g c d ( x , y ) = 1 gcd(x,y)=1 gcd(x,y)=1 ,则有 f ( x ) f ( y ) = f ( x y ) f(x)f(y)=f(xy) f(x)f(y)=f(xy)
  • 两个积性函数的狄利克雷卷积仍为积性函数。

常见的一些积性函数有 φ \varphi φ μ \mu μ ε \varepsilon ε i d id id d d d(因数个数)、 σ \sigma σ(因数和)…


小女子不才,欢迎大佬们找错【捂脸】

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值