莫反初学

莫反最重要的东西就是莫比乌斯函数的一个性质:

\[\mu\ast 1=\varepsilon \]

\(\mu\) 是一个积性函数,所以可以通过这种方式结合数论分块解决一些问题。

P3455

等价于求 \(\sum\limits_{i}\sum\limits_{j}[gcd(i,j)=1]\)。可以通过莫反得到:

\[\begin{aligned} &\sum\limits_{i=1}^m\sum\limits_{j=1}^n[\gcd(i,j)=1]\\ =&\sum\limits_{i=1}^m\sum\limits_{j=1}^n\varepsilon(\gcd(i,j))\\ =&\sum\limits_{i=1}^m\sum\limits_{j=1}^n\sum\limits_{d|\gcd(i,j)}\mu(d)\\ =&\sum\limits_{d=1}^m\mu(d)\sum\limits_{i=1}^{m'}\sum\limits_{j=1}^{n'}\\ =&\sum\limits_{d=1}^m\mu(d)m'n' \end{aligned} \]

用数论分块优化一下就可以了。

AT_abc020_d

\[\begin{aligned} \text{ans}=&\sum\limits_{i=1}^m\text{lcm}(i,k)\\ =&\sum\limits_{i=1}^m\dfrac{ik}{\gcd(i,k)}\\ =&\sum\limits_{g=1}^\min\sum\limits_{i=1}^m\dfrac{ik}{g}[\gcd=g]\\ =&k\sum\limits_{g|k}\sum\limits_{i=1}^{\lfloor\frac{m}{d}\rfloor}i\varepsilon(\gcd') \end{aligned} \]

把后面那一堆拎出来反演可以得到:

\[\sum\limits_{i=1}^{\lfloor\frac{m}{d}\rfloor}i\varepsilon(\gcd')=\sum\limits_{i=1}^{\lfloor\frac{m}{d}\rfloor}i\sum\limits_{t|\gcd'}\mu(t)=\sum\limits_{t|k}t\mu(t)\sum\limits_{i=1}^{\lfloor\frac{m}{dt}\rfloor}i \]

然后可以快速求得。问题在于如何知道 \(\mu(t)\) 的值,只需要先求大概 \(10^7\)\(\mu\),然后大于这个值的 \(t\) 可以想到不会太多,所以暴力去算就可以了。一个需要注意的地方就是考虑到 \(\gcd'\) 的实际含义是 \(\gcd(\frac{i}{g},\frac{k}{g})\),所以显然有 \(\gcd'\le \frac{k}{g}\),需要特殊处理一下。令 \(d(k)\) 表示 \(k\) 的因数个数,那么复杂度是 \(O(d(k)^2)\)

P3312

\(t_x\) 代表 \(x\) 的因数之和,于是答案希望求的实际上是:

\[\sum\limits_{i=1}^m\sum\limits_{j=1}^n[t_{g}\le a]t_g(g=\gcd(i,j)) \]

考虑提一下,得到:

\[\begin{aligned} &\sum\limits_{t_g\le a}t_g\sum\limits_{i=1}^m\sum\limits_{j=1}^n[\gcd(i,j)=g]\\ =&\sum\limits_{t_g\le a}t_g\sum\limits_{i=1}^{m/g}\sum\limits_{j=1}^{n/g}\varepsilon(\gcd(i,j)) \\ =&\sum\limits_{t_g\le a}t_g\sum\limits_{i=1}^{m/g}\sum\limits_{j=1}^{n/g}\sum\limits_{k|g}\mu(k)\\ =&\sum\limits_{t_g\le a}t_g\sum\limits_{k=1}^{m/g}\mu(k)\lfloor\frac{m}{gk}\rfloor\lfloor\frac{n}{gk}\rfloor\\ \end{aligned} \]

\(T=gk\),有:

\[\sum\limits_{T=1}^m(m/T)(n/T)\sum\limits_{k|T}\mu(k)t_{T/k} \]

然后发现后面那一堆和 \(m,n\) 是没有关系的,所以可以令 \(g(T)=\sum\limits_{k|T}\mu(k)t(\frac{T}{k})\)。然后发现对于某个特定的 \(a\),可以看成是有一些的 \(t(x)=0\),剩下的一些都是有原来值的。所以可以把所有询问离线下来,然后按 \(a\) 排序,这样就可以从小到大处理每个询问。而多出来的一个 \(a'\) 带来的影响形如:\(\forall T,x|T,g(T)\leftarrow g(T)+\mu(\frac{T}{x})t(x)\)。当然在做这件事之前还要给 \(t(x)\) 排一下序,到时候用双指针维护一下就可以啦。然后就可以做到单点修改,查询的时候边数论分块边查询区间和,然后树状数组维护就可以啦。

posted @ 2023-01-13 15:18  FeynZc  阅读(156)  评论(0)    收藏  举报