「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了。

你可能感兴趣的:(「CQOI2014」数三角形)