莫比乌斯反演

没做多少题,现在写主要是怕忘了。

关于莫比乌斯函数

首先必须记住得有这个式子。

\[\sum_{d|n}μ(d)=[n==1] \\ (μ*I=ε) \]

比较基础的东西了吧算是。

线性筛法

筛到素数时直接使 \(μ(i)=-1\) 。在筛到合数时,由于我们知道筛到这个合数的一定是它的最小质因子,再结合 \(μ(n)\) 的定义,所以有:

\[i\% prime_j \ne 0 \ \ \ \ \ μ(i\times prime_j)=-μ(i) \\ i\% prime_j = 0 \ \ \ \ \ μ(i\times prime_j)= 0 \ \ \ \]

埃氏筛法

这里写这个的原因是我被某个看起来很水但卡空间时间恶心至极的一道题。(线性筛需要开素数数组爆炸空间,埃筛就直接保存个 \(μ\) 数组就行了),于是乎我在网上找到了这个:

mu[1]=1;
for(int i=1;i<=n/2;++i){
	if(!mu[i]) continue;
	for(int j=i+i;j<=n;j+=i) mu[j]+=mu[i];
}

因为:

\[\sum_{d|n}μ(d)=[n==1] \]

\(n\ne 1\) 时,有:

\[\sum_{d|n,d\ne n}μ(d)+μ(n)=0 \\ μ(n)=-\sum_{d|n,d\ne n}μ(d) \]

关于莫比乌斯反演

\(f,g\) 为定义在正整数上的数论函数,若:

\[g(n)=\sum_{d|n}{f(d)} \]

那么就有:

\[f(n)=\sum_{d|n}{μ(d)g(\frac{n}{d})} \]

这个叫做莫比乌斯反演定理

可以用卷积小证一波:

\[f*I=g \\ f*I*u=g*u \\ f*ε=g*u \\ f=g*u \]

但我遇到题一般都直接套$\sum_{d|n}μ(d)=[n==1] $ (

例题

\(Problem\ b\)

题意:

\(T\) 组询问,每组询问给定 \(a,b,c,d,k\) ,求 \(\sum_{i=a}^{b}\sum_{j=c}^{d}[gcd(i,j)==k]\)

\(1 \le a\le b \le 5e4,1 \le c\le d \le 5e4, 1 \le T,k\le 5e4\)

解题思路:

抛去题面不谈(\(bushi\) ,我们先来想一下如何快速求下式:

\[\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)==k] \]

我们转换思路求枚举 \(k\) 的倍数,那么 \(n,m\) 的枚举上界就化为了\(\lfloor{\frac{n}{k}}\rfloor,\lfloor{\frac{m}{k}}\rfloor\)\([gcd(i,j)==k]\)其实就化为了 \([gcd(i,j)==1]\)。然后我们似乎发现了什么,貌似...能套公式了?

\[\sum_{i=1}^{\lfloor{\frac{n}{k}}\rfloor}\sum_{j=1}^{\lfloor{\frac{m}{k}}\rfloor}[gcd(i,j)==1] \\ \sum_{i=1}^{\lfloor{\frac{n}{k}}\rfloor}\sum_{j=1}^{\lfloor{\frac{m}{k}}\rfloor}\sum_{d|gcd(i,j)}μ(d) \\ \]

\(nice\) ,发现现在又多了一个 \(sigma\) ,但是我们又可以改变枚举顺序了,我们直接把枚举 \(gcd(i,j)\) 约数的循环提到最外面,再将 \(gcd(i,j)\) 这个条件转化为 \([d|i],[d|j]\)

\[\sum_{d=1}^{min(\lfloor\frac{n}{k}\rfloor,\lfloor\frac{m}{k}\rfloor)}μ(d)\sum_{i=1}^{\lfloor{\frac{n}{k}}\rfloor}[d|i]\sum_{j=1}^{\lfloor{\frac{m}{k}}\rfloor}[d|j] \]

容易发现,\(1\) ~ \(\lfloor\frac{n}{k}\rfloor\)\(d\) 的倍数共有 \(\lfloor\frac{n}{kd}\rfloor\) 个,\(1\) ~ \(\lfloor\frac{m}{k}\rfloor\) 同理。

于是乎:

\[\sum_{d=1}^{min(\lfloor\frac{n}{k}\rfloor,\lfloor\frac{m}{k}\rfloor)}μ(d)\lfloor{\frac{n}{kd}}\rfloor \lfloor\frac{m}{kd}\rfloor \]

发现这个就可以很愉快地用数论分块处理啦,复杂度为 \(O(\sqrt{n})\)

那么对于这个题来说,设 \(query(n,m)=\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)==k]\) ,根据二维前缀和的思想,答案即是:

\[query(b,d)-query(b,c-1)-query(a-1,d)+query(a-1,c-1) \]

\(YY的GCD\)

题意:

\(T\) 组询问,每组询问给出 \(n,m\),求出在 \(1\le i\le n,1 \le j \le m\) 的范围内, 有多少对 \(gcd(i,j)\) 为素数。

\(T=1e4,n,m\le 1e7\)

解题思路:

实际上求的是这个(用 \(p\) 表示素数 ):

\[\sum_{p}^{min(n,m)}\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)==p] \]

后面的两个求和与上题不能说十分类似只能说一模一样,我们现在立即把后边那两个玩意儿化成最简形式。

\[\sum_{p}^{min(n,m)}\sum_{d=1}^{min(\lfloor\frac{n}{p}\rfloor,\lfloor\frac{m}{p}\rfloor)}μ(d)\lfloor{\frac{n}{pd}}\rfloor \lfloor\frac{m}{pd}\rfloor \]

发现如果直接对 \(p\)\(d\) 暴力枚举的话,时间复杂度将会变得十分喜人,于是让我们改变枚举顺序。

\(T=dp\) ,于是乎:

\[\sum_{T}^{min(n,m)} \ \lfloor{\frac{n}{T}}\rfloor\lfloor\frac{m}{T}\rfloor \sum_{p|T}\mu( \frac{n}{p}) \]

关于后面的部分用数论分块莽过去,$ \sum_{p|T}\ μ(
\frac{n}{p})$直接跑一遍埃氏筛求出来,再计算前缀和。

\(公约数的和\)

题意:

求:

\[\sum_{i=1}^{n}\sum_{j=i+1}^{n} gcd(i,j) \]

\(2 \le n \le 2e6\)

解题思路:

发现式子除了 \(j=i+1\) 以外跟 \(YY的GCD\) 差不多,但不能直接用,需要转化一下:

\[\sum_{i=1}^{n}\sum_{j=i+1}^{n} gcd(i,j)=\frac{\sum_{i=1}^{n}\sum_{j=1}^{n} gcd(i,j)-\sum_{i=1}^{n}gcd(i,i)}{2} \]

算出来,然后就无了。

\(数表\)

题意

给定一个 \(n \times m\) 的数表,其中第 \(i\) 行 第 \(j\) 列的数值为 \(gcd(i,j)\) 的约数和,给定 \(a\) ,求数表中不大于\(a\) 的和。

多组询问。

\(1 \le n,m \le 1e5 , 1 \le T \le 2e4\)

解题思路

就是求个这玩意儿:

\[\sum_{i=1}^{n}\sum_{j=1}^{m} \sigma(gcd(i,j)) \ (\sigma(gcd(i,j))<a) \]

如果我们忽略掉小于 \(a\) 的条件,然后稍微改动一下——

\[\sum_{i=1}^{n}\sum_{j=1}^{m} \sigma(gcd(i,j)) \\ \sum_{d=1}^{min(n,m)}\sigma(d)\sum_{i=1}^{n}\sum_{j=1}^{m} [gcd(i,j)==d] \]

显然约数和是可以用线性筛直接求出来的,而且后面的一坨式子上文也已经推导过,我们直接来到最后一步——

\[\sum_{d=1}^{min(n,m)}\sigma(d) \sum_{p=1}^{min(\lfloor \frac{n}{d} \rfloor,\lfloor \frac{m}{d} \rfloor)} \mu(p) \lfloor \frac{n}{dp} \rfloor\lfloor \frac{m}{dp} \rfloor \\ \sum_{T}^{min(n,m)} \lfloor{\frac{n}{T}}\rfloor\lfloor\frac{m}{T}\rfloor \sum_{d|T} \ \sigma(d)\mu( \frac{T}{d}) \]

后面照样埃筛。

接下来思考怎么样使 \(\sigma(d)\) 符合小于 \(a\) 的条件。

这时,我们可以首先将询问离线并按照 \(a\) 从小到大进行排序,同时将 \(\sigma(i)\)\(i\) 放进一个结构体中,以 \(\sigma(i)\) 为第一关键字从小到大排序。每到一个询问,就将 \(\sigma(i) (<a)\)\(\sum_{d|T} \ \sigma(d)\mu( \frac{T}{d})\) 的贡献计算出来。

我们可以维护一个保存 \(\sum_{d|T} \ \sigma(d)\mu( \frac{T}{d})\) 的树状数组,每次计算就相当于是单点修改。可以发现此时对于 \(\sigma(d)>a\) 的数值其实是为 \(0\) 的,而 \(\sigma(d)<a\) 的部分也已经全部计算出来,查询前缀和即可。

很多题都会是这种套路。

\(数字表格\)

题意

\[\prod_{i=1}^{n}\prod_{j=1}^{m} fibonacci(gcd(i,j)) \]

多组询问。

\(1 \le n,m \le 1e6 , 1 \le T \le 1e3\)

解题思路

不详细导了(瘫

最终式:

\[\prod_{T}^{min(n,m)} \prod_{d|T} \ fibonacci(d)^{\mu( \frac{T}{d})\lfloor{\frac{n}{T}}\rfloor\lfloor\frac{m}{T}\rfloor} \]

\(约数个数和\)

待补(瘫

posted @ 2022-09-04 21:38  Broken_Eclipse  阅读(36)  评论(1)    收藏  举报

Loading