题目传送门
引理一
引理二
gcd(i,j)−1的证明
对于斜边上的任何一点 (x,y), 其满足:
y−bx−a=d−bc−a
注意:a≤x≤c,b≤y≤d
可知:$$\large \displaystyle y=\frac{d-b}{c-a}(x-a)+b=\frac{\frac{d-b}{gcd(d-b,c-a)}}{\frac{c-a}{gcd(d-b,c-a)}}(x-a)+b
\
\Rightarrow
\
y=\frac{d-b}{gcd(d-b,c-a)}*\frac{x-a}{\frac{c-a}{gcd(d-b,c-a)}}+b \ \ \ x \in Z^+
那么如果使得$y∈Z+$的话,必须使得$c−agcd(d−b,c−a)|(x−a)$,即:$$x=c−agcd(d−b,c−a)∗q+a
对于条件 b≤y≤d 上述式子是由直线方程推出的,因此其在方程中等价于 a≤x≤c, 因此我们只需要考虑 x 的范围限制即可:
a≤x=c−ngcd(d−b,c−a)∗q+a≤c⇒0≤q≤gcd(d−b,c−a)
q 可以取这个区间中的所有整数,因此数量为 gcd(d−b,c−a)+1
然后我们分析对于区间中的任意一个点 (x,y), 由于上面 q 的范围可知 a≤x≤c, 因此均在斜边上不加上两个端点的话,就是 gcd(d−b,c−a)−1
算法分析
本题使用 容斥原理 的思想
题目给定长是n,宽是m的矩形,因此总端点数有(n+1)∗(m+1)个,从总端点数选3个点的情况有
C3(n+1)∗(m+1)种,再将不符合三角形规则的情况减去即可,即 三角形的数目 = C3(n+1)∗(m+1)- 不满足要求的情况(三点共线)
不满足的情况
- 1、 斜率不存在:(m+1)C3n+1
- 2、 斜率为0:(n+1)C3m+1
- 3、斜率存在且不为 0:由两个端点 A,B 组成的横坐标之差是 i ,纵坐标之差是 j 的线段共有 2(n−j+1)(m−i+1) 条,对于每一条线段斜率上共有 gcd(i,j)+1 个端点,减去 A,B 两个端点,即第三个点有 gcd(i,j)−1 种满足情况,因此总方案数是 2(gcd(i,j)−1)(n−j+1)(m−i+1)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2018-06-08 东师理想云平台异步任务处理系统V2.0重构思路
2018-06-08 Mysql查询出所有列名
2018-06-08 IntelliJ IDEA添加jar包
2017-06-08 Mysql中使用存储过程返回查询多个表的数据信息