P5518 [MtOI2019] 幽灵乐团 / 莫比乌斯反演基础练习题
P5518 [MtOI2019] 幽灵乐团 / 莫比乌斯反演基础练习题
题目简述
求:
对于
分别求解. 答案对一个给出的质数 \(P\) 取模.
令 \(N\) 为 \(A,B,C\) 的范围,\(N=10^5\).
\(10^7\leq P\leq 1.05\times 10^9\).
数据组数 \(T=70\).
推导过程
通用部分
因为答案对质数 \(P\) 取模,所以在除法时可以使用逆元,于是拆分分子分母是可行的.
其中,
可以发现
因此,设
则
最终
因此下文的讨论只涉及 \(F\) 和 \(G\).
type=0
\(G_0(A,B,C)\)
预处理时间复杂度:预处理 \(\prod_{i=1}^xi\),\(O(N)\).
单次查询时间复杂度:一次快速幂,\(O(\log N)\).
\(F_0(A,B,C)\)
其中,
于是
令
接下来考虑 \(f\) 的性质:
设
则
其中,当 \(m\geq2\) 时,指数
在
中:
-
若 \(e_j-k_j\geq2\),则 \(\mu\!\left(p_j^{e_j-k_j}\right)=0\),此时整个累乘的结果为 \(0\),对最终的和贡献为 \(0\).
-
若 \(e_j-k_j=1\),则 \(\mu\!\left(p_j^{e_j-k_j}\right)=\mu\!\left(p_j\right)=-1\).
-
若 \(e_j-k_j=0\),则 \(\mu\!\left(p_j^{e_j-k_j}\right)=\mu(1)=1\).
-
上面两种情况的值互为相反数,在其他 \(k_j\) 相同时累乘结果互为相反数,对于最终的和的贡献互为相反数,因此它们对和的贡献为 \(0\).
因此指数为 \(0\). 此时,
当 \(m=1\) 即 \(T=p^e\) 时,上面指数的式子无法拆分,此时
当 \(e-k\geq2\) 时,\(\mu\!\left(p^{e-k}\right)=0\),\(\left(p^k\right)^{\mu(p^{e-k})}=1\),对累乘的结果没有影响. 因此
关于 \(f(T)\) 的讨论到此结束. 我们最终得出了
于是可以使用欧拉筛以 \(O(N)\) 的时间复杂度预处理 \(f(x)\).
预处理 \(f(T)\) 的前缀积,这样就可以使用整除分块的技巧,以
的时间复杂度回答单次询问. \(\left\lfloor\frac{A}{T}\right\rfloor\!\cdot\!\left\lfloor\frac{B}{T}\right\rfloor\) 最大可以达到 \(N^2\gg P\),因为 \(P\) 为质数,\(f(T)\) 是多个不大于 \(T\) 的正整数相乘得到的,且 \(T\leq N<P\),所以底数与模数互质,所以指数可以直接对 \(P-1\) 取模(费马小定理降幂). 这就是时间复杂度式子中 \(\log P\) 的出处.
type=1
\(G_1(A,B,C)\)
需要快速幂预处理 \(\prod_{i=1}^Ni^i\),时间复杂度 \(O(N\log N)\).
\(F_1(A,B,C)\)
其中,
令
则
令 \(T=dx\),则 \(x=\frac{T}{d}\).
则
现在需要预处理 \(f(T)^{T^2}\). 前面推出
当 \(T\neq p^k\) 即 \(f(T)=1\) 时,\(f(T)^{T^2}=1\),单独计算时间复杂度为 \(O(1)\).
当 \(T=p^k\) 时,单独计算时间复杂度为 \(O(\log P)\)(费马小定理降幂). 质数幂在 \([1,N]\) 中的密度约为 \(\frac{1}{\ln N}\),因此预处理 \(f(T)^{T^2}\) 的时间复杂度为
这是几乎线性的,而当 \(\frac{\log P}{\log N}\) 很大时,\(N\) 必然很小.
于是可以用整除分块以 \(O(\sqrt{N}\log P)\) 的时间复杂度回答单次询问.
type=2
\(G_2(A,B,C)\)
进一步展开已经意义不大了.
对于 \(T^{\lfloor A/T\rfloor}\):预处理 \(T\) 的前缀积.
对于 \(\prod_{i=1}^{\lfloor A/T\rfloor}\):在 \(\text{type}=0\) 中已经预处理过了阶乘.
剩下的就是实现细节了.
使用整除分块的技巧,对于每一块 \(\left\lfloor\frac{A}{T}\right\rfloor\),\(\left\lfloor\frac{B}{T}\right\rfloor\),\(\left\lfloor\frac{C}{T}\right\rfloor\) 各自不变,需要做若干次快速幂,回答单次询问时间复杂度为 \(O(\sqrt{N}\log P)\).
\(F_2(A,B,C)\)
对于左边的乘数:
之前推出了
可以发现它和上面的结果结构几乎相同,即
于是
这是可以整除分块的.
其中,求
的时间复杂度为
于是,总体整除分块的时间复杂度为
即
对于右边的乘数:
可以用整除分块以 \(O(\sqrt{N}\log P)\) 的时间复杂度回答单次询问.
最终
回答单次询问的总共的时间复杂度是 \(O\!\left(N^{3/4}\log P\right)\).
总共时间复杂度
预处理:\(O(N\log N)\)
回答单次询问:\(O\!\left(N^{3/4}\log P\right)\)
足以通过本题.
优化
以下关于 \(\log\) 的数值计算默认以 \(2\) 为底(快速幂).
注意到预处理时间复杂度是 \(O(N\log N)\) 的,而回答询问总共的时间复杂度为 \(O\!\left(T\cdot N^{3/4}\log P\right)\).
题目中最大 \(N=10^5\),\(T=70\),\(P\approx 10^9\).
预处理:\(N\log N\approx 1.66\times 10^6\)
查询:\(T\cdot N^{3/4}\log P\approx 1.18\times 10^7\)
即使不考虑常数因子的影响,差距也是悬殊的.
查询的瓶颈在于 \(\text{type}=2\) 的整除分块,而整除分块中计算每一块的瓶颈在于 \(F_0(\dots)\).
接下来分析整除分块的 \(\left\lfloor\frac{N}{i}\right\rfloor\) 在 \(i\in[1,N]\) 上的分布. 这实际上是一个反比例函数,令 \(x\) 轴上为 \(i\),\(y\) 轴上为 \(\frac{N}{i}\),当 \(i\) 取值小时,函数图像陡峭(\(y\) 轴覆盖值域广),此时相应的 \(y\) 值较大;当 \(i\) 取值大时,函数图像平缓(\(y\) 轴覆盖值域窄),此时相应的 \(y\) 值较小. 因此 \(\left\lfloor\frac{N}{i}\right\rfloor\) 在值较小处分布密集,在值较大处分布稀疏.
因为
跟 \(C\) 关系不大,所以我们预处理 \(A,B\leq K\) 时的
用到时加上一个 \(\log P\) 的快速幂即可. 接下来分析当 \(K\) 取多少时,预处理的时间复杂度和查询的时间复杂度持平(此时两者之和最小).
预处理
之前推出
所以,设
其实 \(g(A,B)\) 就是 \(\gcd(i,j)\) 的二维前缀积. 因此
边界条件:\(g(x,0)=g(0,x)=1\).
其中,对于 \(g(A-1,B-1)^{-1}\),我们可以同步处理逆元,\(g^{-1}\) 就是 \(\gcd^{-1}(i,j)\) 的二维前缀积,即
对于 \(\gcd(A,B)\),显然 \(\gcd(A,B)=\gcd(B,A)\),于是只预处理 \(A\geq B\) 的情况,对此我们有经典辗转互除法:
其中 \(\gcd(A,0)=A\).
由于 \(\gcd(A,B)\leq\min(A,B)\leq N\),即 \(\gcd(A,B)\) 的值域为 \(N\),所以我们对于 \([1,N]\) 的每个数预处理逆元,直接费马小定理快速幂以 \(O(N\log P)\) 的时间复杂度预处理即可.
于是 \(g\) 和 \(g^{-1}\) 的单次转移都是 \(O(1)\) 的.
最终,预处理 \(g(A,B)\;(1\leq A,B\leq K)\) 的时间复杂度为 \(O(K^2)\).
查询
在
中,不妨设 \(A=B=C=N\),于是该式变为
先不考虑指数的快速幂.
对于 \(\frac{N}{s}\leq K\) 即 \(s\geq\frac{N}{K}\) 的部分,直接 \(O(1)\) 查表即可,块数最大为 \(O\bigl(\min(K,\sqrt{N})\bigr)\).
对于 \(s<\frac{N}{K}\) 的部分,时间复杂度约为
上限约为
再乘上快速幂的 \(\log P\),于是最终时间复杂度为
综合
预处理:\(O(K^2)\)
查询:\(O\!\left(T\cdot\left(\frac{N}{\sqrt{K}}+\min\!\left(K,\sqrt{N}\right)\right)\log P\right)\)
两者相等,即
将题目的数据范围代入,解方程,\(K\approx 2250\). 实际上,由于 \(K^2\) 的常数极小而右边的常数较大,将 \(K\) 设为 \(3000\) 是实践中的最好选择.
当 \(K=3000\) 时,预处理和总查询的时间复杂度都是 \(9\times 10^6\) 级别的,可以更快地通过本题.