题解 P2241 【统计方形(数据加强版)】
P2241 统计方形
前面几个大佬讲的东西我都看了,数学学得是真好!在此orz了。
但是,题解是给我这种蒟蒻看的,看完了什么也看不懂不就尴尬了吗?
本蒟蒻语数外物化史地政生无一课不弱得要命。
所以,本蒟蒻发得题解一定接地气,保证看懂。
废话不说了,看题解。
首先,统计一个n*m的矩形里有多少个正方形,长方形。
要明确,正方形和长方形都是矩形,那么n*m的矩形里的
矩形数=正方形数+长方形数
明确这一点后,就可以一次求出二者了
如图,长为2宽为1的小长方形用〇来表示,那么
横向排列的就有 *(n-1)m** 个
竖向排列的就有 *n(m-1)** 个
证明:
∵ 矩形长不等于宽
∴ 子矩形构成的矩阵的长宽是由原矩形长宽减去不同数而得
即(n-b)*(m-a) (a≠b)
如图,用 · 表示长宽均为二的正方形
即有(n-1)*(m-1)个小正方形
证明:
∵正方形长等于宽
∴子正方形构成的矩阵的长宽由原矩形长宽减去相同数而得
即(n-b)*(m-a) (a=b)
上代码!(最短)
#include<iostream>
using namespace std;
long long n,m,rec,sqr;
int main() {
cin>>n>>m;
for(int i=0; i<n; i++)//循环,从n-0到n-(n-1)
for(int j=0; j<m; j++) {//循环,从m-0到m-(m-1)
if(i==j) sqr+=(n-i)*(m-j);//如果i==j,说明是正方形
else rec+=(n-i)*(m-j);//如果不等说明是矩形
}
cout<<sqr<<" "<<rec<<endl;//输出
return 0;
}
本蒟蒻做出普及的题很高兴,代码上的问题还望诸佬多指教。
如果诸佬觉得本蒟蒻的疏才浅学还能略有裨益,勿忘赞