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)的向量. 相乘.

代码

https://code.csdn.net/snippets/621864

posted @ 2015-03-17 20:52  wfwbz  阅读(126)  评论(0编辑  收藏  举报