2020牛客寒假算法基础集训营1 A.honoka和格点三角形
题目描述
honoka最近在研究三角形计数问题。
她认为,满足以下三个条件的三角形是“好三角形”。
1.三角形的三个顶点均为格点,即横坐标和纵坐标均为整数。
2.三角形的面积为 。
3.三角形至少有一条边和 轴或 轴平行。
honoka想知道,在平面中选取一个大小为 的矩形格点阵,可以找到多少个不同的“好三角形”?由于答案可能过大,请对 取模。
输入描述:
两个正整数和
输出描述:
面积为1的格点三角形的数量,对 取模的结果。
示例1
输入
2 3
输出
6
这题比赛还是推了一会儿时间,分情况:
1.n=m=2,答案为0(特判)
2.n=2或m=2,答案为
推理如下:
当有行数或列数为2时,不存在底为1,高为2的三角形,只有底为2,高为1的三角形,假令k=max(m,n),则每行选出长为2的底有
种情况,三角形有
种,一共两行,故答案为
3.n>2且m>2,不难发现行与列的公式相同,答案相加即可,我们假定n行m列,只看行。首先找底为2,高为1的三角形,第一行和最后一行为
,中间
行每行有
,所以求和为
;再找底为1,高为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)