洛谷P2241-统计方形-矩形内计算长方形和正方形的数量
洛谷P2241-统计方形
题目描述:
有一个 \(n \times m\) 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。
思路:
所有方形的个数=正方形的个数+长方形的个数。对于任意一个\(x\times y\)的矩形,以这个方形右下角的那个块作为要在矩形内选择正方形\长方形的右下角,则正方形的个数为\(min(x,y)\),长方形的个数为\(x*y\)。
解释如下:对于一个\(x\times y\)的矩形,右下角的块必选,则能和这个块组成的正方形的右上角块全在这个主对角线上,而对角线上块的数量就是\(min(x,y)\)。对于矩形来说,\(x\times y\)的矩形内所有点都能和右下角的这个点构成长方形,所以长方形的数量就是\(x*y\)。
这题主要是要避免同一个正方形/长方形被计算多次,这样计算可以很好的避免。
AC代码:
#include <cstdio>
typedef long long ll;
void solve() {
int n, m;
scanf("%d %d", &n, &m);
ll sqr = 0, all = 0;
for (ll i = 1; i <= n; i++) {
for (ll j = 1; j <= m; j++) {
all += i * j;
sqr += i < j ? i : j;
}
}
printf("%lld %lld\n", sqr, all - sqr);
}
int main() {
solve();
return 0;
}