2020牛客寒假算法基础集训营1 A.honoka和格点三角形

2020牛客寒假算法基础集训营1 A.honoka和格点三角形

题目描述

honoka最近在研究三角形计数问题。
她认为,满足以下三个条件的三角形是“好三角形”。
1.三角形的三个顶点均为格点,即横坐标和纵坐标均为整数。
2.三角形的面积为 。
3.三角形至少有一条边和 轴或 轴平行。
honoka想知道,在平面中选取一个大小为 的矩形格点阵,可以找到多少个不同的“好三角形”?由于答案可能过大,请对 取模。
输入描述:
两个正整数和 2 n , m 1 0 9 (2≤n,m≤10^9)

输出描述:

面积为1的格点三角形的数量,对 1 0 9 + 7 10^9+7 取模的结果。

示例1

输入

2 3

输出

6

这题比赛还是推了一会儿时间,分情况:
1.n=m=2,答案为0(特判)
2.n=2或m=2,答案为 2 m a x ( m , n ) ( m a x ( m , n ) 1 ) 2*max(m,n)*(max(m,n)-1)
推理如下:
当有行数或列数为2时,不存在底为1,高为2的三角形,只有底为2,高为1的三角形,假令k=max(m,n),则每行选出长为2的底有 ( k 2 ) (k-2) 种情况,三角形有 k ( k 2 ) k*(k-2) 种,一共两行,故答案为 2 k ( k 2 ) 2*k*(k-2)
3.n>2且m>2,不难发现行与列的公式相同,答案相加即可,我们假定n行m列,只看行。首先找底为2,高为1的三角形,第一行和最后一行为 m ( m 2 ) m*(m-2) ,中间 ( n 2 ) (n-2) 行每行有 2 m ( m 2 ) 2*m*(m-2) ,所以求和为 2 m ( m 2 ) ( n 1 ) 2*m*(m-2)*(n-1) ;再找底为1,高为2的三角形,前两行和最后两行为 ( m 1 ) ( m 2 ) (m-1)*(m-2) ,中间 ( n 4 ) (n-4) 行每行 2 ( m 1 ) ( m 2 ) 2*(m-1)*(m-2) ,相加得 2 m ( m 1 ) ( n 2 ) 2*m*(m-1)*(n-2) ,将标红部分相加即可得到答案,C++要用快速乘,个人比较懒,挂个python代码供参考:

n,m=map(int ,input().split())
mod=1000000007
if n==2 and m==2:
    print(0)
elif n==2 or m==2:
    k=max(n,m)
    print(2*k*(k-2)%mod)
else:
    print(((m-2)*(4*m*n-6*m-2*n+4)+(n-2)*(4*m*n-6*n-2*m+4))%mod)
发布了288 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43765333/article/details/104175872