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