喵喵题合集

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)\) 个,但注意方向,还有横线或竖线的情况特判一下。

\[ans = \binom{(n + 1)(m + 1)}{3} - (n + 1)\binom{m + 1}{3} - (m + 1)\binom{n + 1}{3} - 2\cdot\sum\limits_{i = 1}^{n}\sum\limits_{j = 1}^{m}(n - i + 1)(m - j + 1)(\gcd(i, 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)。

说不定给你出到模拟赛里……

posted @ 2023-11-16 20:13  SkyMaths  阅读(16)  评论(0)    收藏  举报