BZOJ-3505-数三角形-CQOI2014
描述
给定一个nxm的网格, 请计算三点都在格点上的三角形共有多少个.
分析
- 三角形的三个顶点不能共线. 这是入手点.
- 下面来考虑一个问题, 原点到点(x,y)之间的线段上有几个整点
- 如果把x, y同除以一个数g保证结果是整数, 那么(x/g, y/g)一定是原点到(x,y)的线段上的整点
- 原点到(x,y)的线段上的整点中 每两个相邻的之间的距离相等. 而且等于原点到第一个点的距离.
- 那么找到第一个点就可以知道共有几个了. 比如第一个点(x0,y0). 那么一共x/x0个点.
- 第一个点, 也就是横纵坐标最小的, 就是g最大的. g最大是gcd(x,y). 第一个点的横坐标就是x/gcd(x,y). 带到上面一共gcd(x,y)个整点. 这些点中包含了(x,y).
- 如果不考虑三点共线的情况, 共tot = (m+1)*(n+1)个点, 一共的方案数是C(tot, 3)种.
- 然后就可以枚举从原点出发的向量(x,y), 用gcd算出原点到点(x,y)之间的线段上有几个整点. 然后计算有几个等于(x,y)的向量. 相乘.