码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ-3505-数三角形-CQOI2014

时间:2015-03-17 21:56:58      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:gcd

描述

给定一个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

BZOJ-3505-数三角形-CQOI2014

标签:gcd

原文地址:http://blog.csdn.net/qq_21110267/article/details/44348671

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!