zoukankan      html  css  js  c++  java
  • 莫比乌斯反演题目列表及题解

    前言:

    本题表中,凡是涉及(n、m),都默认(n leq m)
    如果你连莫比乌斯求(sum_{i=1}^n sum_{j=1}^m [gcd(i,j)=1])都还不会,请去这里先入个门。
    题目里面的各种套路还是很深的。
    如果扎扎实实看完(并做完),一般的莫比乌斯反演肯定没问题了(当然不排除一些毒瘤题啦)。

    Part1

    这些题目都非常水,莫比乌斯反演入门题,
    主要是对莫比乌斯反演应用有一个基本概念。

    1.[HAOI2011]Problem b

    (具体题目戳我)
    题目:一组数据((a、d、c、d leq 5×10^4))求

    [sum_{i=a}^{b} sum_{j=c}^d [gcd(i,j)=d] ]

    题解:

    [sum_{i=1}^{n} sum_{j=1}^m [gcd(i,j)=d] = sum_{i=1}^{lfloor frac{n}{d} floor} sum_{j=1}^{lfloor frac{m}{d} floor} [gcd(i,j)=1] = sum_{i=1}^{lfloor frac{n}{d} floor} mu(i)lfloor frac{lfloor frac{n}{d} floor}{i} floor * lfloor frac{lfloor frac{m}{d} floor}{i} floor ]

    数论分块,然后二维容斥即可。

    2.[NOI2010]能量采集

    (具体题目戳我)
    题目:一组数据((n、m leq 10^5)),求

    [2*sum_{i=1}^n sum_{j=1}^m gcd(i,j) - n*m ]

    题解:

    [sum_{i=1}^n sum_{j=1}^m gcd(i,j) =sum_{d=1}^nd sum_{i=1}^{lfloor frac{n}{d} floor} sum_{j=1}^{lfloor frac{m}{d} floor} [gcd(i,j)=1] ]

    枚举(d),然后用第1题的方法搞即可。

    3.Gcd

    (具体题目戳我)
    题目:一组数据,给定整数(N(Nleq10^7)),求(1 leq x,y leq N)(Gcd(x,y))为素数的组数
    题解:

    [sum_{i=1}^n sum_{j=1}^m gcd(i,j) =sum_{d=2}^{d leq n} dsum_{i=1}^{lfloor frac{n}{d} floor} sum_{j=1}^{lfloor frac{m}{d} floor} [gcd(i,j)=1] ]

    枚举素数(d),然后用第1题的方法搞即可。

    4.[中山市选2011]完全平方数

    (具体题目戳我)
    题目:(50)组数据,给出(k),求第(k)个不是完全平方数的倍数的数是多少。(k leq 10^9)
    题解:
    先二分一个(n),然后检查(n)下面有多少个非完全平方数。计算方法为:
    (f(i))表示只为(i^2)倍数,并且不是其它平方数倍数的数的个数。
    那么令(F(i) = f(i)+f(2i)+....+f(ki)),即为((ri)^2)倍数的数的个数。
    那么(F(i) = sum_{i|d} f(d))。显然(F(n) = lfloor frac{n}{i^2} floor)
    反演一下:

    [f(1) = sum_{i=1}^{lceil sqrt{n} ceil } lfloor frac{n}{i^2} floor ]

    直接数论分块即可得到一个数(n)的排名(f(1))

    Part2

    这一部分的题就相当有难度了(跨度这么大我也很无奈啊
    从这些题中,我们可以感受到莫比乌斯反演的一些套路,包括提取公因数、分离变量等。

    5.[BZOJ2154]Crash的数字表格

    (具体题目戳我)
    题目:一组数据,输入(n)(m),((n、m leq 10^7)),求:

    [sum_{i=1}^n sum_{j=1}^m lcm(i,j) quad mod quad 20101009 ]

    题解:

    [Ans = sum_{i=1}^n sum_{j=1}^m lcm(i,j) = sum_{i=1}^n sum_{j=1}^m frac{ij}{gcd(i,j)} = sum_{d=1}^n frac{f(n,m,d)}{d} ]

    其中

    [f(n,m,d) = sum_{i=1}^n sum_{j=1}^m [gcd(i,j)=d]*ij = sum_{i=1}^{lfloor frac{n}{d} floor} sum_{i=1}^{lfloor frac{m}{d} floor} ij*[gcd(i,j)=1]*d^2 ]

    带回原式中:

    [Ans = sum_{d=1}^n d*f({lfloor frac{n}{d} floor},{lfloor frac{m}{d} floor},1) ]

    考虑一下函数 (f) 的求法:

    [f({n},{m},d) = sum_{i=1}^{n } sum_{i=1}^{m } ij*[gcd(i,j)=d] = f(d) ]

    [F(d) = sum_{i=1}^{{n}} sum_{i=1}^{{m}} ij*[d|gcd(i,j)] = sum_{i=1}^{lfloor frac{n}{d} floor} sum_{i=1}^{lfloor frac{m}{d} floor} ij= sum_{n|d} f(d) ]

    反演一下:

    [f(i) = sum_{i|d}mu(frac{d}{i})F(d) , f(1) = sum_{d=1}^nmu(d)F(d) = sum_{d=1}^nmu(d) sum_{i=1}^{{lfloor frac{n}{d} floor}} sum_{j=1}^{lfloor frac{m}{d} floor} ij ]

    显然(sum_{i=1}^{{n}} sum_{j=1}^{{m}} ij = sum_{i=1}^{{n}} i *sum_{j=1}^{{m}} j = frac{n*(n+1)}{2} * frac{m*(m+1)}{2})
    总结一下,得到了两个式子:

    [Ans = sum_{d=1}^n d*f({lfloor frac{n}{d} floor},{lfloor frac{m}{d} floor},1) ]

    [f({n},{m},1) = sum_{d=1}^nmu(d) frac{lfloor frac{n}{d} floor*(lfloor frac{n}{d} floor+1)}{2} * frac{lfloor frac{m}{d} floor*(lfloor frac{m}{d} floor+1)}{2} ]

    两个式子都可以数论分块,所以复杂度为:(O(sqrt{n})*O(sqrt{n})=O({n}))

    6.[SDOI2015]约数个数和

    (具体题目戳我)
    题目:(5×10^4)组数据,输入(n,m)((n,m leq 5×10^4)),(d(x))表示(x)的约数个数,求:

    [sum_{i=1}^n sum_{j=1}^m d(ij) ]

    题解:
    首先,有定理:

    [d(ij) = sum_{t1|i} sum_{t2|j} [gcd(t1,t2)=1] ]

    证明:
    对于一个约数(d),它必定由(i)的一个约数与(j)的一个约数的乘积。
    为了防止算重,我们规定(gcd(t1,t2)=1)才计算。
    因为每一个数一定可以被表示为两个互质的数的乘积,所以这样计算是正确的。
    同样这样的(t1)(t2)一定存在于(i)(j)的约数中,因为唯一分解定理
    所以把原式化为:

    [Ans =sum_{i=1}^n sum_{j=1}^m sum_{t1|i} sum_{t2|j} [gcd(t1,t2)=1] ]

    四个(sum)很不好看(也不好搞),单独考虑二元组(i,j)的贡献:

    [Ans = sum_{u=1}^n sum_{v=1}^m [gcd(u,v)=1] lfloor frac{n}{u} floor lfloor frac{m}{v} floor ]

    [f(d) = sum_{u=1}^n sum_{v=1}^m [gcd(u,v)=d] lfloor frac{n}{u} floor lfloor frac{m}{v} floor ]

    同理令

    [F(d) = sum_{u=1}^n sum_{v=1}^m [d|gcd(u,v)] lfloor frac{n}{u} floor lfloor frac{m}{v} floor = sum_{u=1}^{lfloor frac{n}{d} floor}sum_{u=1}^{lfloor frac{m}{d} floor} lfloor frac{n}{ud} floor lfloor frac{m}{vd} floor ]

    所以

    [F(d) = sum_{u=1}^{lfloor frac{n}{d} floor}sum_{u=1}^{lfloor frac{m}{d} floor} lfloor frac{n}{ud} floor lfloor frac{m}{vd} floor = sum_{u=1}^{lfloor frac{n}{d} floor} lfloor frac{n}{ud} floor *sum_{u=1}^{lfloor frac{m}{d} floor} lfloor frac{m}{vd} floor = sum(lfloor frac{n}{d} floor)*sum(lfloor frac{m}{d} floor) ]

    其中(sum(x)=sum_{i=1}^{x} lfloor frac{x}{i} floor)表示(1)(x)的约数个数和,不懂为什么见这题
    又因为

    [F(i) = sum_{i|d}f(d) ]

    莫比乌斯反演一波:

    [f(1) = sum_{i=1}^n mu(i)F(i) = sum_{i=1}^n mu(i) sum(lfloor frac{n}{i} floor)*sum(lfloor frac{m}{i} floor) = Ans ]

    其中$$sum(x)=sum_{i=1}^{x} lfloor frac{x}{i} floor$$
    显然先 数论分块 预处理(sum(x)),然后每次询问也数论分块求解(f(1))即可。
    总的复杂度为:预处理(O(n sqrt{n})) , 询问 (O(T sqrt{n}))

    7. [SDOI2017]数字表格

    (具体题目戳我)
    题目:
    (f(i))为斐波那契数列第(i)项,定义(f(0)=0,f(1)=1)
    总共输入(10^3)组数据,每次输入(n,m)((n,m leq 10^6)),时限(5 sec),求:

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

    题解:
    肯定先要提出(gcd(i,j))

    [Ans = prod_{i=1}^n prod_{j=1}^m f(gcd(i,j)) = prod_{d=1}^n f(d)^{sum_{i=1}^{lfloor frac{n}{d} floor} sum_{j=1}^{lfloor frac{m}{d} floor} [gcd(i,j)=1]} ]

    上面那一坨提出来看(直接跳步骤了)

    [sum_{i=1}^{lfloor frac{n}{d} floor} sum_{j=1}^{lfloor frac{m}{d} floor} [gcd(i,j)=1] = sum_{i=1}^{lfloor frac{n}{d} floor} mu(i) {lfloor frac{n}{id} floor} {lfloor frac{m}{id} floor} = r(lfloor frac{n}{d} floor,lfloor frac{m}{d} floor) ]

    [Ans = prod_{d=1}^n f(d)^{r(lfloor frac{n}{d} floor,lfloor frac{m}{d} floor)} ]

    显然(Ans)(r(n,m))的求解都可以数论分块,此时复杂度为(O(n))可以跑过单组数据。
    但是我们有多组数据,考虑如何优化。
    看到(id),是不是感觉很套路?令(T = id) , 那么我们把(T)给提出来:

    [prod_{d=1}^n f(d)^{sum_{i=1}^{lfloor frac{n}{d} floor} mu(i) {lfloor frac{n}{T} floor} {lfloor frac{m}{T} floor}} = prod_{T=1}^n(prod_{d|T} f(d)^{mu(frac{T}{d})})^{{lfloor frac{n}{T} floor} {lfloor frac{m}{T} floor}} ]

    [R(T) = prod_{d|T} f(d)^{mu(frac{T}{d})} ]

    这显然是可以(O(n log^2(n)))直接暴力算出来的(因为是枚举因数啊)。
    那么

    [Ans = prod_{T=1}^n(prod_{d|T} f(d)^{mu(frac{T}{d})})^{{lfloor frac{n}{T} floor} {lfloor frac{m}{T} floor}} = prod_{T=1}^nR(T)^{{lfloor frac{n}{T} floor} {lfloor frac{m}{T} floor}} ]

    显然(R(T))是可以记乘法前缀和的,所以每次询问时数论分块搞一波即可。
    总的复杂度: 预处理(O(n log^2(n))) , 询问(O(T sqrt{n}log(n)))

    Part3

    其实比较关键的题目就是(Part2)里的三题了,剩下的这些题当做补充练习。

    8. GCD-2(YY的GCD)

    (具体题目戳我)
    题目:(10^5)组数据,给定整数(N,M(leq10^7)),求(1 leq xleq N) , (1 leq yleq M) ,且(Gcd(x,y))为素数的组数。
    题解:
    其实就是第三题《(GCD)》的升级版。
    前面的步骤直接跳过:

    [Ans = sum_{d=1}^n sum_{i=1}^{lfloor frac{n}{d} floor} mu(i) lfloor frac{n}{id} floor lfloor frac{m}{id} floor ]

    老套路,令(T = id),提出(T)

    [sum_{d=1}^n sum_{i=1}^{lfloor frac{n}{d} floor} mu(i) lfloor frac{n}{id} floor lfloor frac{m}{id} floor = sum_{T=1}^n sum_{d|T} mu(frac{T}{d}) lfloor frac{n}{T} floor lfloor frac{m}{T} floor = sum_{T=1}^nlfloor frac{n}{T} floor lfloor frac{m}{T} floor sum_{d|T} mu(frac{T}{d}) ]

    然后只要考虑这个玩意怎么搞即可:

    [R(T) = sum_{d|T} mu(frac{T}{d}) ]

    额...还记得在基础数论讲素数时说的那个结论吗?
    结论回顾: 质数的密度大约是(frac{1}{10})!
    所以(O(10^7k) ------> O(10^6k)?)
    嗯,好像是这样,所以暴力埃式筛即可。

    9. [UVa11426]最大公约数之和——极限版II

    (具体题目戳我)
    题目:(10^2)组数据,给定整数(n,m(leq10^7)),求:

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

    题解:
    其实就是第二题《能量采集》的升级版。
    考虑二元组((i,j))的构成形式,一共三种:(i<j)(i=j)(i>j)
    所以只要求(sum_{i=1}^n sum_{j=1}^n gcd(i,j) = Ans'),那么显然:

    [Ans = frac{(Ans' - sum_{i=1}^n i)}{2} ]

    下面求(Ans'),前面的步骤直接跳过:

    [Ans' = sum_{d=1}^n dsum_{i=1}^{lfloor frac{n}{d} floor} mu(i) {lfloor frac{n}{id} floor }^2 ]

    还是老套路(套路就是这么神奇),令(T = id),提出(T)

    [Ans' = sum_{T=1}^n sum_{d|T} mu(frac{T}{d}) {lfloor frac{n}{T} floor }^2 d = sum_{T=1}^n {lfloor frac{n}{T} floor }^2sum_{d|T} mu(frac{T}{d}) d ]

    那么显然下面这个东东:

    [R(x) = sum_{d|T} mu(frac{T}{d})*d ]

    是一个狄利克雷卷积 , 直接积性函数线性筛即可。

    10.HDU4746: (Mophues)

    (具体题目戳我)
    名字莫名诡异....
    题目:(5*10^3)组数据 , 每次给定一个(n,m,p)((<=5*10^5)),求:

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

    其中其中(h(x))表示一个数质因数分解后质数的个数。例如:(12=2×2*3),那么(h(12)=3)
    题解:
    非常有意思的一题。
    首先大力化式子(与前面所有题目方法类似):

    [Ans = sum_{T=1}^n lfloor frac{n}{T} floor lfloor frac{m}{T} floor sum_{d|T} [h(d) leq p] mu(frac{T}{d}) = sum_{T=1}^n lfloor frac{n}{T} floor lfloor frac{m}{T} floor R(p,T) ]

    考虑如何求(R(p,T))

    [R(p,T) = sum_{d|T} [h(d) leq p] mu(frac{T}{d}) ]

    发现在([1,n])中,(h(i) leq 18) , ((2^{18} = 262144) , (2^{19} = 524288)
    所以就非常神奇了 , 当(18 < p)时,直接输出(n*m)即可。
    所以只要处理(0 leq p leq 18)的前缀和即可。
    这个还是比较简单的吧,分(3.5)步走:
    (0)显然(h(i))在求(mu(i))时可以顺便求出来。
    (1)埃氏筛处理(E(p,x) = sum_{d|T} [h(d) = p] mu(frac{T}{d}))
    (2)统计一下(S(p,x) = sum_{i=1}^p E(i,x))
    (3)统计一下(R(p,x) = sum_{i=1}^x S(p,i))
    然后每次询问时直接调用(R(p,x)),接着数论分块即可。

    11.[ZOJ3435]Ideal Puzzle Bobble

    (具体题目戳我)
    题目:求:

    [sum_{i=1}^L sum_{j=1}^W sum_{k=1}^H[gcd(i,j,k)==1] ]

    题解:
    这题应该放到(Part1)里去的...

    [Ans = sum_{i=1}^{min(L,W,H)} mu(i) lfloor frac{L}{i} floor lfloor frac{W}{i} floor lfloor frac{H}{i} floor ]

    12.来历不明的火题:

    题目:一组数据,给定(n,k)((n leq 10^7) , (k leq 10^5)) , 求:

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

    题解:
    首先先打一个预防针:(q(i)=i^k)请线性筛好不然肯定会超时。
    然后先化式子:

    [Ans = sum_{d=1}^n d^{2k+1} sum_{i=1}^{lfloor frac{n}{d} floor} sum_{j=1}^{lfloor frac{n}{d} floor}[gcd(i,j)=1]i^kj^k = sum_{d=1}^n d^{2k+1} R(lfloor frac{n}{d} floor) ]

    然后求解(R(x))

    [f(d) = sum_{j=1}^{lfloor frac{n}{d} floor}[gcd(i,j)=d]i^kj^k ]

    所以构造倍数形式莫比乌斯:

    [F(d) = sum_{j=1}^{n}[d|gcd(i,j)]i^kj^k = sum_{d=1}^{n}d^{2k}sum_{i=1}^{lfloor frac{n}{d} floor}sum_{j=1}^{lfloor frac{n}{d} floor}i^kj^k ]

    上面这步是关键(提出(d)),然后继续化:

    [F(d) = sum_{d=1}^{n}d^{2k}sum_{i=1}^{lfloor frac{n}{d} floor}i^k *sum_{j=1}^{lfloor frac{n}{d} floor}j^k = sum_{d=1}^n d^{2k} *[sum(frac{n}{d})]^2 ; ]

    其中(sum(d))为乘法前缀和,预处理一下即可。
    接着就可以莫比乌斯反演了:

    [R(n) = f(1) = sum_{d=1}^n mu(d) F(d) = sum_{d=1}^n mu(d) d^{2k} sum(lfloor frac{n}{d} floor) ; ]

    [Ans = sum_{d=1}^n d^{2k+1} R(lfloor frac{n}{d} floor) ]

    注意一下$x{2k}=(xk)^2 ; x^{2k+1} = x^{2k}*x $ , 不能用快速幂。
    显然两边都可以数论分块,(O(n))计算即可 , 注意常数问题。

    Part INF

    这里总结一下套路:
    (1)遇见(id)形式,换元提出(T=id)

    [Sample=sum_{d=1}^n sum_{i=1}^{lfloor frac{n}{d} floor}mu({i}) lfloor frac{n}{id} floor = sum_{T=1}^n lfloor frac{n}{T} floor sum_{d|T}mu(frac{T}{d}) ]

    那么后面那一坨就很有可能可以线性筛、分块(或者搞事情)之类的。
    (2)构造(F(d))时提出公因子(d)

    [Sample = F(d) = sum_{j=1}^{n}[d|gcd(i,j)]ij = sum_{d=1}^{n}dsum_{i=1}^{lfloor frac{n}{d} floor}sum_{j=1}^{lfloor frac{n}{d} floor}ij= sum_{d=1}^{n}d(sum_{i=1}^{lfloor frac{n}{d} floor}i)^2 ]

    然后后面的一坨一般就比较好算了,从而达到化简式子的目的。

  • 相关阅读:
    Jenkins遇到问题一:jenkins配置权限不对导致无法登陆或者空白页面解决办法
    翻页功能的测试用例
    Jenkins学习二:Jenkins安装与配置
    Jenkins学习一:Jenkins是什么?
    Java MyEclipse下Ant build.xml简单实例详解
    Linux环境中Openfire安装指南
    Linux下查看文件和文件夹大小
    Tsung测试openfire服务器
    Windows环境中Openfire与Spark安装与配置指南
    解决-bash: lsb_release: command not found
  • 原文地址:https://www.cnblogs.com/GuessYCB/p/8277359.html
Copyright © 2011-2022 走看看