复习了一些数论手法。
考虑以下转换:
σ(ijk)=∑x|i∑y|j∑z|k[gcd(x,y)=1][gcd(y,z)=1][gcd(z,x)=1]
证明就是对于第 t 个质因子,其在三个数中的出现次数是 at,bt 和 ct,则因数个数是 ∏t(at+bt+ct+1)。考虑右式,计算这样的三元组数。每一个质因子分开考虑,无非就是其不出现,或者仅出现于三个数中的一个。用乘法原理计数一下,得到的也是 ∏t(at+bt+ct+1)。故上式成立。
稍微变形:
A∑i=1B∑j=1C∑k=1[gcd(i,j)=1][gcd(j,k)=1][gcd(k,i)=1]⌊Ai⌋⌊Bj⌋⌊Ck⌋
这个东西已经有三元环计数的雏形了,但是边数太多。考虑继续大力莫反,则式子变成了:
min(A,B)∑i=1min(B,C)∑j=1min(C,A)∑k=1μ(i)μ(j)μ(k)f(⌊Alcm(k,i)⌋)f(⌊Blcm(i,j)⌋)f(⌊Clcm(j,k)⌋)
其中 f(x)=x∑i=1σ(i),这可以预处理出来。
我们对这个东西建图,三元环计数。具体来说,就是把莫比乌斯函数值不为 0 的数当作点,将最小公倍数在 max{A,B,C} 以内的两个数连边。令人惊讶的是,这样的图边数是在 8×105 的级别的。跑一遍三元环就行了。
还有一个小问题,就是怎么建图。不能直接枚举每两个点之间有没有边。但是可以考虑先枚举两点的最大公因数,再枚举两个它的倍数,在最小公倍数过大时停止。虽然复杂度还是暴力的,但是因为边数少,所以实际上跑得很快。
本文作者:TulipeNoire
本文链接:https://www.cnblogs.com/TulipeNoire/p/18725450/P4619
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步