拿这个代码交了 JZOJ 4991(此题的 A,B,C≤5000 弱化版),成功拿到 14ms 最优解(
A∑i=1B∑j=1C∑k=1d(ijk)=A∑i=1B∑j=1C∑k=1∑x|i∑y|j∑z|k[gcd(x,y)=1][gcd(x,z)=1][gcd(y,z)=1]=A∑x=1B∑y=1C∑z=1⌊Ax⌋⌊By⌋⌊Cz⌋[gcd(x,y)=1][gcd(x,z)=1][gcd(y,z)=1]=A∑x=1B∑y=1C∑z=1⌊Ax⌋⌊By⌋⌊Cz⌋∑i|gcd(x,y)μ(i)∑j|gcd(x,z)μ(j)∑k|gcd(y,z)μ(k)=min(A,B)∑i=1μ(i)min(A,C)∑j=1μ(j)min(B,C)∑k=1μ(k)∑lcm(i,j)|x⌊Ax⌋∑lcm(i,k)|y⌊By⌋∑lcm(j,k)|z⌊Cz⌋
记 f0(n)=∑n|x⌊Ax⌋,类似地有 f1,f2,上式变为 min(A,B)∑i=1μ(i)min(A,C)∑j=1μ(j)min(B,C)∑k=1μ(k)f0(lcm(i,j))f1(lcm(i,k))f2(lcm(j,k))
注意到可以把枚举的三元组 (i,j,k) 看做一堆三元环然后做三元环计数,同时统计答案。
注意到有很多无贡献的边可以直接删掉,包括 μ(u)=0,μ(v)=0,lcm(u,v)>min(A,B,C) 的 u,v 的边。
于是我们剪枝剪掉一堆边之后边就变得很少了,直接暴力上三元环计数。
同时注意三元环计数无法考虑自环,特判一下有两个数相等或是三个数均相等的三元组即可。
据说 Cache Miss 使得 vector 存图会快很多?
参考了 GKxx 大佬的代码。
1 |
|