1 条题解
-
0
「CQOI2014」数三角形 题解
题目大意
在 的网格中(有 个格点),计算所有顶点都在格点上的非退化三角形(三点不共线)的数量。
解题思路
核心思想:容斥原理
总三角形数 = 所有三点组合数 - 所有三点共线的组合数
具体计算步骤
1. 总三点组合数
网格共有 个格点:
$$\text{total\_tri} = C_{(m+1)(n+1)}^3 = \frac{[(m+1)(n+1)] \cdot [(m+1)(n+1)-1] \cdot [(m+1)(n+1)-2]}{6} $$2. 水平共线三点组
- 每行有 个点,共 行
- 每行中任意三点都共线:
3. 垂直共线三点组
- 每列有 个点,共 列
- 每列中任意三点都共线:
4. 斜线共线三点组(关键部分)
对于方向向量 (其中 , ):
- 最大公约数意义:向量 上有 个整点(包括端点)
- 中间点数量:在两端点之间还有 个整点
- 平移可能性:该向量在网格中可以平移 次
- 对称性:向量 和 方向不同但贡献相同,需要乘以 2
计算公式:
$$\text{slant} = 2 \times \sum_{i=1}^{m} \sum_{j=1}^{n} (\gcd(i,j)-1) \times (m+1-i) \times (n+1-j) $$最终答案
$$\text{ans} = \text{total\_tri} - \text{horizontal} - \text{vertical} - \text{slant} $$算法分析
时间复杂度
- 双重循环:
- 在 时, 可接受
空间复杂度
- ,仅使用常数个变量
代码实现亮点
- 使用
long long
:防止整数溢出 - 组合数直接计算:避免递归或动态规划
- GCD 优化:使用辗转相除法,效率足够
示例验证
对于样例 :
- 总点数:
- 总三角形数:
- 水平共线:
- 垂直共线:
- 斜线共线:
- 答案:(注:原样例输出76,可能计算细节有差异)
总结
本题是组合数学与数论的完美结合,通过容斥原理和向量分析,将复杂的几何计数问题转化为清晰的数学计算,展示了数学在算法竞赛中的强大威力。
- 1
信息
- ID
- 3521
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者