2020牛客寒假算法基础集训营1
A题honoka和格点三角形
补题ing
传送门
这道题就是分类,避免重复
写这道题的时候我和我的dad的对话:
part1:
dad:你在干什么
me:我在画三角形
dad:你这样话的出来?正常都要用不同颜色的笔区分呀,这叫做分类
me:你说对了,这道题就是分类
dad:(邪魅一笑)
part2:(对话基础为昨天)
me:你说今天晚上有一场比赛我打不打
dad:(无言)
me:(思考一会儿),欸,算了,还是不打了,明天早上起来再写,免得掉分
dad:(笑出了猪叫声),你说你几十分钟写三个题也好意思,不掉分才怪
me:???emmm…
(好了,回归正文)
我们设输入数据的m,n中m为x轴,n为y轴
“好三角形”在坐标轴中分为两种:
1.两边都平行于坐标轴
这种情况只需要找到12的矩形有几个即可,一个12的矩形有4个符合要求的"好三角形"
计算式:4 * ((n - 2) * (m - 1) + (n - 1) * (m - 2))
2.只有一边平行于坐标轴
(此种情况又分为四种小情况)
1)一边平行于x轴,底为2,高为1,排除两边平行于坐标轴的情况
计算式:(2 * (n - 1) * (m - 2) % mod) * (m - 2)
- 一边平行于x轴,底为1,高为2,排除两边平行于坐标轴的情况
计算式:(2 * (n - 2) * (m - 1) % mod) * (m - 2)
- 一边平行于y轴,底为2,高为1,排除两边平行于坐标轴的情况
计算式:(2 * (n - 2) * (m - 1) % mod) * (n - 2)
- 一边平行于y轴,底为1,高为2,排除两边平行于坐标轴的情况
计算式:(2 * (n - 1) * (m - 2) % mod) * (n - 2)
最后记得每次计算完都要求余mod哦~
废话废完啦,上代码~
#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
typedef long long ll;
ll n, m;
int main()
{
cin >> n >> m;
ll ans = 0;
ans += 4 * ((n - 2) * (m - 1) + (n - 1) * (m - 2));//两边平行于坐标轴
ans %= mod;
ans += (2 * (n - 1) * (m - 2) % mod) * (m - 2);//一边平行于x轴,底为2,高为1,排除两边平行于坐标轴的情况
ans += (2 * (n - 2) * (m - 1) % mod) * (m - 2);//一边平行于x轴,底为1,高为2,排除两边平行于坐标轴的情况
ans += (2 * (n - 2) * (m - 1) % mod) * (n - 2);//一边平行于y轴,底为2,高为1,排除两边平行于坐标轴的情况
ans += (2 * (n - 1) * (m - 2) % mod) * (n - 2);//一边平行于y轴,底为1,高为2,排除两边平行于坐标轴的情况
ans %= mod;
cout << ans << endl;
return 0;
}