在学了一下莫比乌斯反演,做了一丢丢的题目后,终于对莫比乌斯反演又有了一点的浅薄的理解,我觉得有必要写一下有关于莫比乌斯反演的一些套路和一些化简式子的奇技淫巧了。
如果不是愿意学莫比乌斯反演的话,看这篇博客纯粹浪费您的时间。这里边讲套路边讲优化,不一定模块十分清晰。
1 . 增加枚举变量
\[\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j) = 1] \]在求解这类式子的时候,我们虽然看起来是 \(O(nm)\) 的复杂度,其实优化后是可以达到 \(O(\sqrt{min(n,m)})\) ,这个优化幅度是很大的,原来的 \(n=10^5\) 都不可过,但是现在过 \(10^{10}\) 轻而易举。那怎么化简呢?
其实上面的那个式子对于艾佛森括号我们是可以转化成 $$
对于这个卷积我们可以拆分一下,就能够得到一个 原本没有的 \(\sum\) ,这叫做增加枚举变量。我们进行化开吧
\[\sum_{i=1}^n\sum_{j=1}^m\sum_{d|gcd(i,j)}\mu(d)I(\frac{gcd(i,j)}{d}) \]因为 \(I(n) = 1\) ,所以我们可以忽略掉这么个玩意,这里同时也算是给出了一种题目的套路,下文就不给证明了。
\[\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|gcd(i,j)}\mu(d) \]2.交换枚举顺序
这里用到就是更改枚举顺序,在 \(\sum\) 这个符号里面,我们是可以将一些不隶属于这个 \(\sum\) 的玩意给他提出来,具体点说,我们可以将一个与 \(\sum\) 的枚举变量无关给提到 \(\sum\) 外边去,(你当然需要加工一下,不是无偿提取),这里就体现为:我们将 \(d\) 给它提前面去 ,我们枚举 \(d\) ,那就有
\[\sum_{d=1}^{\min(n,m)}\sum_{i}^{n}[d|i]\sum_{j=1}^m[d|j]\mu(d) \]因为我们发现 \(\mu(d)\)跟我枚举不枚举 \(i,j\) 有关系吗?显然是没有的,那么我们就能改变一下,将其化为
\[\sum_{d=1}^{\min(n,m)}\mu(d)\sum_{i}^{n}[d|i]\sum_{j=1}^m[d|j] \]3. 删除无用变量
所谓的删除无用变量并不是说我直接删掉一些变量,而是说,根据题目的某些性质,我直接干掉一些枚举变量,减少枚举的次数,或者简单点说,干掉 \(\sum\) 这么个玩意。那么这个玩意我怎么搞呢?
显然前面的那一个 \(\sum\) 是不可搞得,我们看一下后面的那两个可不可以作一下。答案当然是可以的。我们考虑一下后两个 \(\sum\) 是个什么意思。
\[\sum_{i}^{n}[d|i]\sum_{j=1}^m[d|j] \]这个意思不就是说 \(n\) 中有多少 \(d\) 个倍数 \(m\) 中有多少个 \(d\) 的倍数,那么我们也就可以直接将这两个 \(\sum\) 删除掉,转化成多少个不就完了,也就是
\[\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor \]那么我们就可以将上述式子化简为
\[\sum_{d=1}^{\min(n,m)}\mu(d)\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor \]然后我们发现这个东西就可以用数论分块搞成 \(O(\sqrt{\min(n,m)})\) 的了,关于数论分块不会的话,建议学一下。
那么我们就能将上面的本来 \(O(nm)\) 的复杂度优化成 \(O(\sqrt{\min(n,m)})\) ,这个优化幅度是很大的。
4.换元
这是个初中都会,但高中都需要学的个玩意。顾名思义,就是将一个式子转化成一个变量之类的。我们以题目为例,化简如下式子
\[\sum_{i=1}^{n}\sum_{j=1}^{m}\mu^2(gcd(i,j)) \] \[\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|gcd(i,j)}\mu^2(d)[gcd(i,j) = d] \] \[\sum_{d=1}^{\min(n,m)}\mu^2(d)\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j) = d] \] \[\sum_{d=1}^{\min(n,m)}\mu^2(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\sum_{k|gcd(i,j)}\mu(k) \] \[\sum_{d=1}^{\min(n,m)}\mu^2(d)\sum_{k=1}^{n}\mu(k)\lfloor\frac{n}{dk}\rfloor\lfloor\frac{m}{dk}\rfloor \]上述的化简都可以在上文找到一定的依据,就不必说了,我们说一下换元,我们直接将 \(T=dk\) , 因为我们删除变量的时候,其中如果有变量相互联系的话,就会导致我们删除变量的操作崩塌,所以我们直接让其成为一个变量。就能够得到
\[\sum_{T=1}^{min(n,m)}\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\sum_{d|T}\mu^2{(d)\mu(\frac{T}{d})} \] \[\sum_{d|T}\mu^2{(d)\mu(\frac{T}{d})}$$ 是可以直接知道的 : $$\sum_{i=1}^{\sqrt{T}}\mu(i) \]这是一个结论 , 既然这样了,那么我们也就能够 \(O(\sqrt{\min(n,m)})\) 的求解出来了,这道题的 \(n,m\leq 10^{13}\) 然后就让我们搞没了。
套路 1
\[\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j) = k] \]
我们能够得到一个结论,上面证明过了 \(1,k\) 是一样的,无非就是换了换而已。结论为 :
\[\sum_{j=1}^{n}\sum_{j=1}^{m}[gcd(i,j) = k] <=>\sum_{d = 1}^{\min(n,m)}\mu(d)\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor \]套路 2
\[\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j) \]