「CQOI2014」数三角形
题意:
给定一个n*m 的网格,请计算三点都在格点上的三角形共有多少个。
1<=n,m<=1000
ANS=总数-在同一条直线上的三点-在同一条斜线上的三点
在同一条直线很容易就可以做出来,我们主要考虑的是斜边的做法
最暴力的方法是枚举一条斜边的起点(a1,b1)与终点(a2,b2)
这条斜边上去掉起终点共有gcd(|a2-a1|,|b2-b1|)-1个点,每次枚举的方案数只需要加上这个最大公约数即可
这样,你肯定可以愉快的TLE
我们发现,一些同样的斜边会被计算多次,我们可不可以优化他呢?!
很显然,一条线段通过平移肯定可以将起点平移到(1,1),这样,我们只需要枚举终点
随后将答案乘以(m-i+2)*(n-j+2)*2
2由于矩阵对角线相等且互相平分,所以计算两个对角线这需要将方案数*2
搞出(m-i+2)*(n-j+2)这个东西,我们可以吧一条斜边想象成一个矩阵的对角线,这样就可以了
到这里,我们可以愉快的ac了。