题目
有一个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<iostream>
using namespace std;
long long n,m,a1,a2;
int main(){cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(i==j){//i==j,此时为正方形a1+=(n-i)*(m-j);}else{a2+=(n-i)*(m-j);}}}cout<<a1<<" "<<a2;return 0;
}
思路二:
一、算正方形的个数
如果我们固定了正方形的右下角(i,j),此时可能的正方形的个数为min(i,j),所以可以枚举右下角,计算此时答案,求和即可。
二、算长方形个数
其实算长方形并不常见,但算矩形应该经常遇到,所以这里可以先算矩形,再联系第一个问题,那答案就转化为矩形个数-正方形个数。像求解正方形个数一样,固定矩形右下角(i,j),显然此时矩形个数为i*j,同理,求和即可。
代码
#include<iostream>
#include<cmath>
using namespace std;
long long n,m,a1,a2;
int main(){cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){a1+=min(i,j);//正方形个数a2+=i*j; //矩形个数}}cout<<a1<<" "<<a2-a1;return 0;
}