莫比乌斯反演学习笔记
资料:https://blog.csdn.net/skywalkert/article/details/50500009
https://blog.csdn.net/acdreamers/article/details/8542292
概念:
数论函数:若 $f(n)$ 的定义域为正整数域,值域为复数域,则称 \(f(n)\) 为数论函数。
积性函数:若 \(f(n)\) 是数论函数,且 \(f(1) = 1\),对于互质的正整数 \(p,q\) 有 \(f(p \cdot q) = f(p) \cdot f(q)\),则称其为积性函数。若 \(f(n)\) 为积性函数,且对于任意正整数 \(p,q\) 都有 \(f(p \cdot q) = f(p) \cdot f(q)\),则称其为完全积性函数。
狄利克雷卷积:对于数论函数 \(f\) 和 \(g\) 的狄利克雷卷积为 \((f*g)(n) = \sum _{d|n} f(d) \cdot g(\frac{n}{d})\)。狄利克雷卷积满足交换律、结合律,对加法满足分配律 \(^{\alpha}\)。存在单位元函数 \(e(n) = [n=1]\) 使得 \(f*e = e*f = f\)。若 \(f\) 和 \(g\) 为积性函数,则 \(f*g\) 也是积性函数 \(^{\beta}\)。
\(\diamondsuit\)简单证明:
\(\alpha .\)分配律: $f_1 * g + f_2 * g = \sum _{d|n} f_1(d) g(\frac{n}{d}) + \sum _{d|n} f_2(d) g(\frac{n}{d}) = \sum _{d|n} (f_1(d) + f_2(d)) g(\frac{n}{d}) = (f_1 + f_2) * g$
\(\beta .\) 设积性函数 \(f, g\) 和 \(h=f*g \),对于任意一对互质正整数 \(a, b\),有
$h(a)=\sum _{d_1|a}f(d_1)g(\frac{a}{d_1})$
$h(b)=\sum _{d_2|b}f(d_2)g(\frac{b}{d_2})$
$h(a)h(b)=\sum _{d_1|a并d_2|b}f(d_1)g(\frac{a}{d_1})f(d_2)g(\frac{b}{d_2})$
由于 $gcd(a,b)=1$,故 $gcd(d_1,d_2)=1,gcd(\frac{a}{d_1},\frac{b}{d_2})=1$。所以有,$h(a)h(b)=\sum_{(d_{1}d_{2})|(ab)}f(d_{1}d_{2})g(\frac{ab}{d_{1}d_{2}})$。令 $d=d_{1}d_{2}$,则有 $h(a)h(b)=\sum_{d|(ab)}f(d)g(\frac{ab}{d})=h(ab)$ 。
故 $ h=f*g $ 是积性函数。
函数和性质:
一、常用积性函数:
1、莫比乌斯函数 $\mu(n)$,在狄利克雷卷积中与恒等函数互为逆元。
$\mu(n)=\begin{cases} 1, n=1\\(-1)^k, n=p_{1}p_{2}...p_{k}\\0,other\end{cases}$
2、恒等函数 $I(n)=1$,完全积性。
3、除数函数 $\sigma _k(n) = \sum _{d|n} d^k $,表示 $n$ 的约数的 $k$ 次幂和。
4、约数个数函数 $\sigma_0(n) =\sum _{d|n}1$,表示 $n$ 的约数个数。
5、约数和函数 $\sigma _1(n) = \sum _{d|n} d $,表示 $n$ 的约数和。
6、欧拉函数 $\varphi (n)=\sum_{i=1}^{n}[gcd(n,i)=1]$,表示不大于 $n$ 且与 $n$ 互质的正整数个数。另外有$\sum_{i=1}^{n}[gcd(n,i)=1] \cdot i = \frac{n \cdot \varphi(n)+[n=1]}{2}$,且对于正整数 $n>2$ 来说 $\varphi(n) $ 是偶数。
7、元函数 $e(n)=[n=1]$,狄利克雷卷积的乘法单位元,完全积性。
8、单位函数 $id(n)=n$,完全积性。
9、幂函数 $id^{k}(n)=n^{k}$,完全积性。
二、关于莫比乌斯函数和欧拉函数的两个经典公式
1、$[n=1]=\sum _{d|n} \mu(d) $
证明:
应用:
一、求满足$x \in (a_1,b_1), y \in (a_2,b_2)$ 且 $gcd(x,y) = k$ 的 $(x,y)$ 的对数。
例题1、BZOJ2818
题意:
给定整数 $N$,求 $1 \le x,y \le N$ 且 $gcd(x,y)$ 为素数的数对(x,y)有多少对。
思路:
设 $f(n)$ 为 $[1,N]$ 中满足 $gcd(x,y)=n$ 的 $(x,y)$ 对数,令 $F(n) = \sum _{n|d} f(d)$,则 $F(n)$ 代表满足 $n|x$ 并且 $n|y$ 的 $(x,y)$ 的对数。易知 $F(n)=(\lfloor \frac{N}{n} \rfloor)^2 $,于是我们有 $f(n)=\sum _{n|d} \mu(\frac{d}{n})F(d)=\sum _{n|d} \mu(\frac{d}{n})(N/d)^2$,且求 $[1,N]$ 范围中的 $f(n)$ 可转换成求 $[1,N/n]$ 中的 $f(1)$,此时 $f(1) = \sum_{d=1}^{N/n} \mu(d) (N/n/d)^2$。
于是,这道题的一种做法就是:先预处理出莫比乌斯函数的前缀和。然后枚举 $[1,N]$ 中的所有质数 $p$,求 $f(1)=\sum_{d=1}^{N/p} \mu(d) \underline{(N/p/d)^2}$,后面的划下划线的部分可以用数论分块优化到 $O(\sqrt n)$,前面的莫比乌斯函数用前缀和计算。所有 $f(1)$ 加起来就能得出答案。
AC代码:
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 typedef long long LL; 5 const int MAXN=1e7+5; 6 bool check[MAXN]; 7 int prime[MAXN],tot; 8 int mu[MAXN]; 9 LL pre[MAXN]; 10 11 void init(){ 12 mu[1]=1; 13 for(int i=2;i<MAXN;i++){ 14 if(!check[i]){ 15 prime[tot++]=i; 16 mu[i]=-1; 17 } 18 for(int j=0;j<tot;j++){ 19 if(1LL*i*prime[j]>=MAXN) break; 20 check[i*prime[j]]=true; 21 if(i%prime[j]==0){ 22 mu[i*prime[j]]=0; 23 break; 24 } 25 else 26 mu[i*prime[j]]=-mu[i]; 27 } 28 } 29 for(int i=1;i<MAXN;i++) 30 pre[i]=pre[i-1]+mu[i]; 31 } 32 33 34 int main(){ 35 init(); 36 LL n; 37 scanf("%lld",&n); 38 LL ans=0; 39 for(int i=0;i<tot;i++){ 40 LL p=prime[i]; 41 if(p>n) break; 42 //数论分块 43 LL l=1,r; 44 while(l<=n/p){ 45 r=n/p/(n/p/l); 46 ans+=(pre[r]-pre[l-1])*(n/l/p)*(n/l/p); 47 l=r+1; 48 } 49 //************************************************* 50 } 51 printf("%lld\n",ans); 52 53 return 0; 54 }