喵喵题合集
P3166 [CQOI2014] 数三角形
标签
枚举,容斥,gcd,细节,贡献,莫比乌斯反演,莫反
思路
感觉挺水的,但是没做出来,感觉代码很简单,但是打了好久,细节有点多,还是太菜了。
首先一眼容斥,题目说的不是很清楚啊,可能要猜一下题意。
反正总的三角形(含退化为线段的)个数为 \(\binom{(n + 1)(m + 1)}{3}\),减去共线的贡献,这个可以考虑枚举线的形态,枚举形状,当前为 \((i, j)\) 点代表 \(((0, 0), (i, j))\) 的线段,线段上有 \(\gcd(i, j) + 1\) 个点,这种形状的线段有 \((n - i + 1)(m - j + 1)\) 个,但注意方向,还有横线或竖线的情况特判一下。
代码
复杂度为 \(O(nm\log n) = O(n^2\log n)\),但可以优化为(递推 \(\gcd\))\(O(nm) = O(n^2)\) 但没必要。
code
另一种做法
省流:莫反优化。
考虑优化最后那个东西,考虑快速求出 \(\sum\limits_{i = 1}^{n}\sum\limits_{j = 1}^{m}(n - i + 1)(m - j + 1)(\gcd(i, j) - 1)\)
只需快速求出 \(\sum\limits_{i = 1}^{n}\sum\limits_{j = 1}^{m}(n - i + 1)(m - j + 1)\gcd(i, j)\)
因为有 \(i = \sum\limits_{d|i}\varphi(d)\)
故 \(\gcd(i, j) = \sum\limits_{d|\gcd(i, j)}\varphi(d) = \sum\limits_{d|i, d|j}\varphi(d)\)
即求 \(\sum\limits_{i = 1}^{n}\sum\limits_{j = 1}^{m}(n - i + 1)(m - j + 1)\sum\limits_{d|i, d|j}\varphi(d)\)
即求 \(\sum\limits_{d = 1}^{min(n, m)}\varphi(d)\sum\limits_{i = 1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j = 1}^{\lfloor\frac{m}{d}\rfloor}(n - i\cdot d + 1)(m - j\cdot d + 1)\)
后面的那个 \(f(d) =\sum\limits_{i = 1}^{\lfloor\frac{n}{d}\rfloor}(n - i\cdot d + 1)\sum\limits_{j = 1}^{\lfloor\frac{m}{d}\rfloor}(m - j\cdot d + 1)\)
然后,啊这,这是两个等差数列求和后相乘。
复杂度为 \(O(n)\)。
但是因为这题的答案是 \(n^6\) 级别的,long long 最大 \(2^{63}\),只能达到 \(n = 1000\) 左右了。
或者如果用 __int128,\((2^{127})^{\frac{1}{6}} = 2^{20}\),啊这,好像可以。
即 \(n = 10^6\),个人认为 \(n = 5\cdot 10^5\) 对防止溢出比较友好一点(不然爆 __int128)。
说不定给你出到模拟赛里……

浙公网安备 33010602011771号