__CrossBow_EXE__
2024-11-15 22:39:51
我的想法与其他题解有不同之处。不同在于:我使用了一种比较新颖的办法——个人称为升降法,以及数形结合的思想。
首先,观察这幅图:(图丑见谅)
不难发现,这些矩形就像是题目中的加数,依次递增,而且公差为一。我们想求它们的和,等价于求它们的面积和。
接着,我们将这些矩形拦腰截断:
此时,图形分为上下两部分:上方可以看作一个三角,下方可以看作一个矩形。全图的面积自然是它们两个的面积之和。
我们小学时就学过,三角形的面积公式为
不过,值得注意的一点是,这个三角形的底和高相等,都是那条红线。所以,它的面积也可以表示为
这个就更简单了,就是底乘高嘛。
经过上面的分析,我们发现:无论是三角形还是矩形,他们的面积都与下面的矩形的长和宽有关。
所以,我们可以枚举它的长和宽,看看面积和是否为
至于输出什么,肯定是左边矩形的高度和右边矩形的高度了。如果用
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
int m;
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>m;
for(int i=1;i<=m;i++){//底座高度
for(int j=2;i*j<=m;j++){//底座宽度
int up=(j-1)*j/2;//上面的三角
int down=i*j;//下面的底座
if(up+down==m) cout<<i<<' '<<i+j-1<<endl;
}
}
return 0;
}
感谢观看!