传送门 to PoPoQQQ神犇,膜拜一下。
概述
一个神奇的函数。定义也很神奇。是个积性函数。
定义
μ ( 1 ) = 1 \mu(1)=1 μ(1)=1 。对于 x ( x > 1 ) x(x>1) x(x>1),若 x = p 1 t 1 p 2 t 2 p 3 t 3 … p m t m x=p_1^{t_1}p_2^{t_2}p_3^{t_3}\dots p_m^{t_m} x=p1t1p2t2p3t3…pmtm (指 x x x 的唯一素数分解), μ ( x ) = { ( − 1 ) m ( ∀ y ∈ [ 1 , m ] , t y = 1 ) 0 ( ∃ y ∈ [ 1 , m ] , t y > 1 ) \mu(x)=\begin{cases}(-1)^{m} & (\forall y\in [1,m],t_y=1)\\ 0 & (\exist y\in[1,m],t_y>1)\end{cases} μ(x)={(−1)m0(∀y∈[1,m],ty=1)(∃y∈[1,m],ty>1)
应用
思想是类似 容斥 的玩意儿。(看到负一的多少多少次方,很有可能是容斥嘛!)
莫比乌斯反演
考虑这样的定义:
F ( x ) = ∑ y ∣ x f ( y ) F(x)=\sum_{y|x}f(y) F(x)=y∣x∑f(y)
现在我们要想办法用 F F F 表示 f f f 。
- F ( x ) F(x) F(x) 中有 f ( x ) f(x) f(x) 这一项。先拿一个 F ( x ) F(x) F(x) 。
- 多出来的是 x x x的其他因子。只好减掉。
怎么枚举其他因子?只需要在唯一素数分解中任选一个质因数,将其指数减少一即可。
但是,如果有两个质因数,其指数都少了一,怎么办?加回来。
或者用韦恩图来表示这一关系。不妨设 x x x 只有三个质因数。
y y y 是 x x x 的因数,充要条件是:唯一素数分解下, y y y 的每一个质因数的指数都不大于 x x x 的对应指数。
所以, x x x 的全部因数(不包含 x x x ),就是上图中的全集(至少有一个质因数的指数是严格小于)。此时便可容斥。
最后写结论。 f ( x ) = ∑ y ∣ x μ ( y ) F ( x y ) f(x)=\sum_{y|x}\mu(y)F\left(\frac{x}{y}\right) f(x)=y∣x∑μ(y)F(yx)
还有另一种形式,也是容斥: F ( d ) = ∑ d ∣ n f ( n ) ⇔ f ( d ) = ∑ d ∣ n μ ( n d ) F ( n ) F(d)=\sum_{d|n}f(n)\;\Leftrightarrow\;f(d)=\sum_{d|n}\mu\left(\frac nd\right)F(n) F(d)=d∣n∑f(n)⇔f(d)=d∣n∑μ(dn)F(n)
其他的函数
比如这样的函数:
S
(
n
,
p
)
=
∑
x
=
1
n
[
gcd
(
x
,
p
)
=
1
]
S(n,p)=\sum_{x=1}^{n}[\gcd(x,p)=1]
S(n,p)=x=1∑n[gcd(x,p)=1]
设 p = p 1 t 1 p 2 t 2 p 3 t 3 ⋯ p m m ( p x ∈ P ) p=p_1^{t_1}p_2^{t_2}p_3^{t_3}\cdots p_m^{m}(p_x\in \Bbb{P}) p=p1t1p2t2p3t3⋯pmm(px∈P) , P \Bbb{P} P 是质数集。
考虑 p x p_x px 的倍数,必然不与 p p p 互质。这样的数有 p p x \frac{p}{p_x} pxp 个。
若减去 ∑ p p x \sum\frac{p}{p_x} ∑pxp ,会重复。有些数又是 p x p_x px 的倍数,也是 p y ( x ≠ y ) p_y(x\ne y) py(x=y) 的倍数。需减去。
容斥思想很明显了嘛!
注意 x ≠ y x\ne y x=y 。因为 p x 2 p_x^2 px2 的倍数没有被多减去。
n ( n ≤ 1000000 ) n(n\le 1000000) n(n≤1000000) 最多有 7 7 7 个不同的质因数,复杂度就会是 O ( 2 7 ) \mathcal O(2^7) O(27) 。——事实上不会总是七个质因数的。
最后写结论。 S ( n , p ) = ∑ d ∣ p μ ( d ) ⌊ n d ⌋ S(n,p)=\sum_{d|p}\mu(d)\left\lfloor\frac{n}{d}\right\rfloor S(n,p)=d∣p∑μ(d)⌊dn⌋
奇怪的玩意儿
传说中的 ∑ d ∣ n μ ( d ) d = φ ( n ) n \sum_{d|n}\frac{\mu(d)}{d}=\frac{\varphi(n)}{n} d∣n∑dμ(d)=nφ(n)
证明很简单,注意到 n = ∑ d ∣ n φ ( d ) n=\sum_{d|n}\varphi(d) n=∑d∣nφ(d) ,代入反演公式即可。
还有一个 ∑ x ∣ n μ ( x ) = ϵ ( n ) \sum_{x|n}\mu(x)=\epsilon(n) x∣n∑μ(x)=ϵ(n)
证明仍然很简单,利用 μ ( n ) = ∑ d ∣ n μ ( d ) ϵ ( n d ) \mu(n)=\sum_{d|n}\mu(d)\epsilon(\frac{n}{d}) μ(n)=∑d∣nμ(d)ϵ(dn) 进行反演的逆推。
计算
线性筛
可以在线性筛的同时一起计算,因为这是一个积性函数。
mu[1] = 1; // here it is!
for(int i=2; i<=n; ++i){
if(isPrime[i]){
primes.push_back(i);
mu[i] = -1; // here it is!
}
for(int j=0,len=primes.size(); j<len; ++j){
if(1ll*i*primes[j] > n) break;
isPrime[i*primes[j]] = false;
mu[i*primes[j]] = -mu[i]; // here it is!
if(i%primes[j] == 0){
mu[i*primes[j]] = 0; // here it is!
break;
}
}
}
杜教筛
利用这条性质: ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu(d)=[n=1] d∣n∑μ(d)=[n=1]
用狄利克雷卷积写出来就是 μ ∗ I = ϵ \mu * I=\epsilon μ∗I=ϵ
所以
∑ i = 1 n ϵ ( n ) = ∑ i = 1 n I ( i ) S ( ⌊ n i ⌋ ) ⇒ S ( n ) = 1 − ∑ i = 2 n S ( ⌊ n i ⌋ ) \sum_{i=1}^{n}\epsilon(n)=\sum_{i=1}^{n}I(i)S\left(\left\lfloor\frac{n}{i}\right\rfloor\right)\\ \Rightarrow S(n)=1-\sum_{i=2}^{n}S\left(\left\lfloor\frac{n}{i}\right\rfloor\right) i=1∑nϵ(n)=i=1∑nI(i)S(⌊in⌋)⇒S(n)=1−i=2∑nS(⌊in⌋)
map<int,int> mp;
int sumMu(int n){
if(n < sqrtN) return mu[n];
if(mp.count(n)) return mp[n];
int res = 1;
for(long long l=2,r; l<=n; l=r){
r = n/(n/l)+1;
res = (res-(r-l)*sumMu(n/l)%Mod+Mod)%Mod;
}
return mp[n] = res;
}