莫比乌斯专题总结

好久了,终于把莫比乌斯那几道题做完了
想着刚开始听学长讲课还一脸蒙比,现在已经能自己做出来较难的题了,还是很高兴的
先对莫比乌斯反演下一个总结:把一个含有许多或的式子拆成更多的式子,然后在通过一系列操作消掉一些式子,使得最终得到的式子在给定时间内可求

下面大量概念预警

莫比乌斯函数µ(d)

定义µ(d)=/1 d=1

     |(-1)^k d=p1p2p3pk(pi!=pj)

     otherwise

性质∑d|nµ(d)=[n=1]

证明:当n=1时,显然成立

   当n>1时,n=p1a1+p2a2+......+pkak

   则∑d|nμ(d)=μ(1)+μ(p1)+μ(p2)++μ(p1p2)++μ(p1p2p3)++μ(p1p2pk)

           =(0,k)*(-1)+(1,k)*(-1)+......+(k,k)*(-1)01k

           =0

 筛法:一般就线性筛就好了

 

void get_mu() {
  mu[1] = 1;
  for (int i = 2; i < maxn; i++) {
    if (vis[i] == false) {
      prime[cnt++] = i;
      mu[i] = -1;
    }
    for (int j = 0; j < cnt && i * prime[j] < maxn; j++) {
      vis[i * prime[j]] = true;
      if (i % prime[j] == 0) break;
      mu[i * prime[j]] = -mu[i];
}
View Code

有了这个就可以在需要判断条件的时候把判断变成简单的相加

数论分块

莫比乌斯反演最常用配套算法

我们看一个简单的例子,求∑i=1~n[n/i]([]表示向下取整)

我们发现对于一段连续的区间,[n/i]的值是相同的,那么怎么求出来这个区间呢

经过试验我们发现对于一个起点i,和他值相等的最右端点为[n/[n/i]]

这样我们就可以在√n的复杂度下求出该式

对于两个限制条件m n,我们只需要取一个min就好

for(int i=,j;i<=n;i=j+1){
            j=min((n/(n/i)),(m/(m/i)));
            ans+=(sum[j]-sum[i-1])*(n/i)*(m/i);
        }
View Code

卷积

对于h(n)=∑d|nf(d)g(n/d)

满足结合律,封闭性,单位元,逆元,同时还满足交换律

以及最重要的:若f,g为积性函数,则h为积性函数

一些比较常用的积性数论函数

积性函数

F=f1

然后我们就可以开始做莫比乌斯反演了

几道水题:[bzoj2820]YY的GCD

     [bzoj2693]jzptab

      [BZOJ3994]约数个数和(题解

对我来说有难度的题:

1 [bzoj3309] DZY Loves Math

 反演很好写,但是其中一个函数的性质没有想明白,TLE得很惨

2 [bzoj4816]数字表格

 题解

3 [bzoj3529]数表

 反演也很简单,就是<=a不好处理,但是n的范围又足够承受nlogn

 我们可以把所有询问都读入,然后sort一遍,配合数状数组,就可以做到nlogn了

4 [bzoj3601] 一个人的数论(好题)

 第一道反演有难度的题,主要瓶颈在于把自然数幂和转为d+1次的多项式

 然后使用高斯消元得到多项式系数,就可以做了,复杂度很小

 (这题竟然不用筛µ,也不用数论分块)

最后总结一下,一般就是把gcd(i,j)=1化成∑µ,再证明积性函数而做到线性筛,最后用数论分块求解

f=μF
${color{Teal} 只}$${color{Teal} 是}$${color{Teal} 拼}$${color{Teal} 凑}$${color{Teal} 出}$${color{Teal} 与}$${color{Teal} 你}$${color{Teal} 在}$${color{Teal} 一}$${color{Teal} 起}$${color{Teal} 的}$${color{Teal} 时}$${color{Teal} 间}$
原文地址:https://www.cnblogs.com/mikufun-hzoi-cpp/p/11083874.html