P2241 统计方形(数据加强版)题解

题目

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

输入输出格式

输入格式

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

输出格式

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

输入输出样例

输入样例

2 3

输出样例

8 10

解析

思路一:统计一个n*m的矩形里有多少个正方形,长方形。要明确,正方形和长方形都是矩形,那么n*m的矩形里的矩形数=正方形数+长方形数

∵ 长方形长不等于宽
∴ 子长方形的长宽是由原矩形长宽减去不同数而得,即(n-b)*(m-a) (a≠b)
∵正方形长等于宽
∴子正方形构成的矩阵的长宽由原矩形长宽减去相同数而得,即(n-b)*(m-a) (a=b)

代码

#include
using namespace std;
long long n,m,a1,a2;
int main(){
	cin>>n>>m;
	for(int i=0;i

思路二:

一、算正方形的个数

如果我们固定了正方形的右下角(i,j),此时可能的正方形的个数为min(i,j),所以可以枚举右下角,计算此时答案,求和即可。

二、算长方形个数

其实算长方形并不常见,但算矩形应该经常遇到,所以这里可以先算矩形,再联系第一个问题,那答案就转化为矩形个数-正方形个数。像求解正方形个数一样,固定矩形右下角(i,j),显然此时矩形个数为i*j,同理,求和即可。

代码

#include
#include
using namespace std;
long long n,m,a1,a2;
int main(){
	cin>>n>>m;
	for(int i=0;i

你可能感兴趣的:(数学算法知识专题,暴力枚举算法专题,算法,c++)