莫比乌斯反演推式子
前置
根据莫比乌斯反演,我们有:
\[[gcd(i,j)=1]=\sum_{d|gcd(i,j)}\mu(d)
\]
一
给定 \(n,m(n\leq m)\),求:
\[\sum_{i=1}^n \sum_{j=1}^m [\gcd(i,j)=1]
\]
直接代换,有:
\[\sum_{i=1}^n \sum_{j=1}^n \sum_{d|\gcd(i,j)}\mu(d)
\]
因为 \(d|\gcd(i,j)\),所以 \(d|i,d|j\)。我们改为枚举 \(d\):
\[\sum_{d=1}^n \lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor\mu(d)
\]
至于这一步为何是正确的,我们可以考虑对于每个 \(d\) 计算其 \(\mu(d)\) 产生的贡献。
此时我们直接使用整除分块可获得 \(O(\sqrt n)\) 的好成绩。
为了简便起见,我们将这种枚举 \(d|\gcd(i,j)\) 的套路称为套路一。
二
给定 \(n,m,k\),求:
\[\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=k]
\]
我们不妨设 \(n\leq m\),避免分讨而不失一般性。
注意到如果 \(\gcd(i,j)=k\),那么 \(k|i,k|j\)。所以缩小枚举范围:
\[\sum_{i=1}^{\lfloor \frac{n}{k} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{k} \rfloor}[\gcd(i,j)=1]
\]
使用套路一,有:
\[\sum_{d=1}^{\lfloor \frac{n}{k} \rfloor}\mu(d)\lfloor \frac{n}{kd} \rfloor\lfloor \frac{m}{kd} \rfloor
\]
直接使用整除分块,可获得 \(O(\sqrt n)\) 的好成绩。
我们把这种通过 \(\gcd(i,j)=k\) 推出 \(k|i,k|j\) 进而缩小枚举范围且转变为 \(\gcd(i,j)=1\) 的套路称为套路二。
三
给定 \(n,m\),求:
\[\sum_{i=1}^n \sum_{j=1}^m \gcd(i,j)
\]
不妨设 \(n\leq m\)。
设 \(d=\gcd(i,j)\),使用套路二,有:
\[\sum_{d=1}^n\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} [\gcd(i,j)=1]d
\]
使用套路一,有:
\[\sum_{d=1}^n \sum_{k=1}^{\lfloor \frac{n}{d} \rfloor}d\mu(k)\lfloor \frac{n}{kd} \rfloor\lfloor \frac{m}{kd} \rfloor
\]
使用两次整除分块,即可获得 \(O(n)\) 的好成绩。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通