从数学的角度解决本题
2025-03-19 13:42:24
发布于:广东
6阅读
0回复
0点赞
这个问题通过构造可以转换为一个等价的问题:
求m*n个格子的矩形中有多少不同的正方形。其中矩形和正方形都由单位格子构成。
我们首先可以知道最大的正方形边长为min(m,n),最小的正方形边长为1。
那么就可以通过数正方形的方式得到不同的正方形的总数。从最小的开始数,会发现边长为1的正方形有m*n个。
接着数边长为2的正方形。如果觉得不好数,可以数边长为2的正方形的中心点数量,会发现那些不在矩形边缘的交叉点均可以作为边长为2的正方形的中心(交叉点周围有四个块),因此得到不在边缘的交叉点的数量是(m-1)*(n-1),这就是边长为2的正方形的数量。
同理,我们可以通过数正方形的中心点(交叉点)或者中心块的方式得到边长为3的正方形的数量、边长为4的正方形的数量……等等,直到数到边长为min(m,n)的正方形的数量,接着把所有边长的正方形的数量相加,就得到了问题的答案。
从而得到公式:令a = min(m,n),方案数
例如题目中4*6的矩形的可选方案数 =
本题从数学角度得到解答。
参考代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int main(){
cin>>n>>m;
int maxlen = min(n,m);//正方形边长最大值
long long ans = 0;
for(int i=1;i<=maxlen;i++){
ans+=(m-i+1)*(n-i+1);
}
cout<<ans;
return 0;
}
这里空空如也
有帮助,赞一个