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

CODE懒的发

 

转载于:https://www.cnblogs.com/handsome-zlk/p/10609692.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值