2020牛客寒假算法基础集训营1 A-honoka和格点三角形(数学)

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

做的时候感觉思路上应该没什么问题,样例也都过了。
赛后看题解,还是不知道什么问题。

wa了无数发的代码:

#include <iostream>
#define mod 1000000007
#define ll long long
using namespace std;

int main(void)
{
	ll n, m;
	cin >> n >> m;
	if (n * m < 6) {
		cout << "0";
		return 0;
	}
	ll ans = ((n - 1) * (m - 2) % mod + (n - 2) * (m - 1) % mod) * m * 2 % mod
		   + ((n - 1) * (m - 2) % mod + (n - 2) * (m - 1) % mod) * n * 2 % mod
		   - ((n - 1) * (m - 2) * 4) % mod
		   - ((n - 2) * (m - 1) * 4) % mod;
	cout << ans % mod;
	return 0;
}

赛后看了大佬们的思路及代码后整理了一下:

1.以矩阵的横向为底,纵向为高。

ll ans1 = ((n - 1) * (m - 2) % mod + (n - 2) * (m - 1) % mod) * m % mod;

2.以矩阵的纵向为底,横向为高,但要避免重复。

ll ans2 = ((n - 1) * (m - 2) % mod + (n - 2) * (m - 1) % mod) * (n - 2) % mod;

赛后AC代码:

#include <iostream>
#define mod 1000000007
#define ll long long
using namespace std;

int main(void)
{
	ll n, m;
	cin >> n >> m;
	ll ans1 = ((n - 1) * (m - 2) % mod + (n - 2) * (m - 1) % mod) * m % mod;
	ll ans2 = ((n - 1) * (m - 2) % mod + (n - 2) * (m - 1) % mod) * (n - 2) % mod;
	cout << (ans1 + ans2) * 2 % mod;
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值