转换思维,枚举其他要素

博客分析了一种解决在n×m棋盘上计算正方形和长方形数量的方法。通过枚举右下顶点并利用斜率为1的直线,可以有效地计算出正方形(res1 += min(i, j))和长方形(res2 += i * j - min(i, j))的数量。输入为两个正整数n和m,输出为两个计数结果。代码简洁高效,适用于大尺寸棋盘。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

有一个 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;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值