洛谷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;
}

posted @ 2021-02-06 15:13  牟翔宇  阅读(905)  评论(0编辑  收藏  举报