CSP/信奥赛C++语法基础刷题训练(34):洛谷P2241:统计方形
题目背景
1997年普及组第一题
题目描述
有一个 n × m n \times m n×m 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。
输入格式
一行,两个正整数 n , m n,m n,m( n ≤ 5000 , m ≤ 5000 n \leq 5000,m \leq 5000 n≤5000,m≤5000)。
输出格式
一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。
样例 #1
样例输入 #1
2 3
样例输出 #1
8 10
AC代码
#include<bits/stdc++.h>
using namespace std;
/*枚举
枚举每一个格子,看以它为左上角的矩形共有多少个
以x,y为左上角坐标的矩形个数:(n-x)*(m-y)
以x,y为左上角坐标的正方形个数:min(n-x,m-y)
以上规律,同学们可以画出就能轻松分析出来
另外注意:本题要开long long
*/
long long n,m,ans1=0,ans2=0; //ans1统计矩形总数,ans2统计正方形总数
void cnt(int x,int y){//以x,y为左上角坐标,统计其方形个数
ans1+=(n-x)*(m-y);//矩形总数
ans2+=min(n-x,m-y);//正方形个数
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cnt(i,j);
}
}
cout<<ans2<<" "<<ans1-ans2;//长方形个数=矩形个数-正方形个数
return 0;
}
文末彩蛋: