统计方形(数据加强版)——排列组合|何时开long long?

题目背景

1997年普及组第一题

题目描述

有一个 \(n \times m\) 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。

输入格式

一行,两个正整数 \(n,m\)\(n \leq 5000,m \leq 5000\))。

输出格式

一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。

样例 #1

样例输入 #1

2 3

样例输出 #1

8 10

我的作答

#include <bits/stdc++.h>
using namespace std;

int main() {
	long long m,n;
	cin >> n >> m;
	long long ju = (n * (n + 1) / 2) * (m * (m + 1) / 2);
	long long zh = 0;
	for (int i=1;i<=(m>n?n:m);i++) {
		zh += (n-i+1)*(m-i+1);
	}
	long long ch = ju - zh;
	cout << zh << " " << ch;
	return 0;
}

总结

解题思路

  1. 正方形的数量
    遍历正方形的边长从1到min(m,n),以正方形的左上角为基准,找右下对角的点,可以看到边长为1时正方形数量mn,边长为2时(m-1)(n-1)……以此类推,for循环求和
  2. 矩形的数量
    确定一个矩形的方法——两横边两竖边,1个格子两条边,横纵分别m+1、n+1条边,排列组合m+1里找2、n+1里找2,相乘即可
  3. 长方形的数量
    除了正方形就是长方形,用矩形数量减去正方形数量

反思

当通过率有一半时,考虑很可能是int达到上限了,开long long。

posted @ 2024-10-30 22:46  xiins  阅读(28)  评论(0编辑  收藏  举报