题目传送
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;
}