题目描述
有一个 n×m 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。
输入格式
一行,两个正整数 n,m( n≤5000,m≤5000)。
输出格式
一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。
输入输出样例
输入 #1
2 3
输出 #1
8 10
分析:
确定一个方形需要四个点,但在方格纸上确定一个方形,只需要两个点即可(位于任一对角线的两点),至于是正方形还是矩形可以根据横纵距离判断,但直接枚举两个点不能过掉这道题目,所以我们可以只枚举一个点,这里我们选择枚举右下的顶点,过该点作一条斜率为1的直线,那么位于这条直线上且处在该点右上方的所有点都可以与该点组成一个正方形,反之所有不满足这个条件的点与该点组成的就是矩形,代码如下:
#include<iostream>
using namespace std;
int n,m;
long long res1,res2;
int main()
{
cin>>n>>m;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
res1+=min(i,j); // 正方形
res2+=i*j-min(i,j);
}
}
cout<<res1<<' '<<res2;
return 0;
}