资料: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) 也是积性函数 (^{eta})。
(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$
(eta .) 设积性函数 (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)=egin{cases} 1, n=1\(-1)^k, n=p_{1}p_{2}...p_{k}\0,otherend{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} floor)^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代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 ",ans); 52 53 return 0; 54 }