算法学习:莫比乌斯反演

【前置知识】

【数论分块】

【问题描述】求令i从1到n,i整除k的和

【解决方法】显而易见的,1~n的某个区间内,i整除k的值是相同的,所以我们只需要找到这个区间,然后用区间个数乘以这个区间的贡献(即i整除k的值)

  

1  int res=0;
2  for(int d=1;d<=nn;) {
3         int enn = nn/(nn/d);
4         int en = min(enn,nn);
5         res += (nn/d)*(d+en)*(en+1-d)/2;
6         d = en+1;
7     }
View Code

【积性函数】

  对 函数F(X) ,满足当a,b互质时,有F(a*b)=F(a)*F(b),则称函数F(X)为积性函数

  积性函数一般都可以通过埃筛或者线性筛常数时间求取

 

  此处列举几个比较重要且常用的积性函数

  φ(x) :  欧拉函数,小于等于x且和x互质的数的个数

  Ι (x): 函数值恒为1的函数

  id(x):   函数值等于x的函数

  ε(x): 元函数,只有当x等于1时为1,其余情况均为0

 

【莫比乌斯函数】

ti 是指第 i 个数的质因子的幂次方

函数定义是:

1.当n==1时,函数值等于1

2.当有质因子的幂次方大于1的情况,函数为0

3.当所有的质因子的幂次方都等于1时,函数为(-1)的k次方,k指不同的质因子的个数

求1~MAXN的莫比乌斯函数的代码板子

 

 1 int mu[MAXN], prime[MAXN],vis[MAXN],sum[MAXN];
 2 int cnt = 0;
 3 void init()
 4 {
 5     mu[1] = 1;
 6     cnt = 0;
 7     for (int i = 2; i < MAXN; i++)
 8     {
 9         if (vis[i] == 0)
10         {
11             mu[i] = -1;
12             prime[++cnt] = i;
13         }
14         for (int j = 1; j <= cnt && i*prime[j]<MAXN; j++)
15         {
16             vis[prime[j] * i] = 1;
17             if (i%prime[j] == 0)
18             {
19                 mu[i*prime[j]] = 0;
20                 break;
21             }
22             else
23             {
24                 mu[i*prime[j]] = -mu[i];
25             }
26         }
27     }
28     for (int i = 1; i < MAXN; i++)
29         sum[i] = sum[i - 1] + mu[i];
30 }
View Code

 

莫比乌斯函数还有一个特殊的性质

令F(x)等于,x的所有因子的莫比乌斯函数的和

则F(x)的函数值只有当x为1时等于1,其余情况均为0

(利用质因子互质的性质可以证出来,此处就不给出证明)

 

【狄利克雷卷积】

  狄利克雷卷积是对两个函数进行操作,函数f,g的卷积等于,令d为n的因子,有f(d)*g(n/d),n的所有因子的和即为f,g的狄利克雷卷积

  有性质:

  

 

  由上面的狄利克雷卷积定义我们可以得到以下结论:

 【结论一】由莫比乌斯函数的特殊性质可知,有  I*μ==ε
 【结论二】和莫比乌斯函数类似,欧拉函数也有一特殊性质:

   令F(x)等于,x的所有因子的欧拉函数的和 

   则F(x)的函数值为x

(利用欧拉函数的定义可以证出来,此处就不给出证明)

   1.    φ*Ι==id

   2.    φ==id*μ

  推导和结论如下:

 

【莫比乌斯反演】

  

(摘自https://oi-wiki.org/math/mobius/

  推导过程如下

 

 

      

 

posted @ 2019-07-25 09:23  rentu  阅读(246)  评论(0编辑  收藏  举报