莫比乌斯反演学习笔记

资料: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 }
View Code

 

 

 

 

 

 

 

posted @ 2018-07-31 18:53  Blogggggg  阅读(237)  评论(0编辑  收藏  举报