统计方形(数据加强版)——排列组合|何时开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到min(m,n),以正方形的左上角为基准,找右下对角的点,可以看到边长为1时正方形数量mn,边长为2时(m-1)(n-1)……以此类推,for循环求和 - 矩形的数量
确定一个矩形的方法——两横边两竖边,1个格子两条边,横纵分别m+1、n+1条边,排列组合m+1里找2、n+1里找2,相乘即可 - 长方形的数量
除了正方形就是长方形,用矩形数量减去正方形数量
反思
当通过率有一半时,考虑很可能是int达到上限了,开long long。