统计方形(数据加强版)

文章讲述了如何优化计算n×m棋盘上正方形和长方形数量的算法。原方法因时间复杂度为n^4导致超时,改用新方法通过遍历行和列,累加不同尺寸的矩形数量,避免了数据溢出问题。
摘要由CSDN通过智能技术生成

统计方形(数据加强版)

题目背景

1997年普及组第一题

题目描述

有一个 n × m n \times m n×m 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。

输入格式

一行,两个正整数 n , m n,m n,m n ≤ 5000 , m ≤ 5000 n \leq 5000,m \leq 5000 n5000,m5000)。

输出格式

一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。

样例 #1

样例输入 #1

2 3

样例输出 #1

8 10

本来想的是通过四个坐标确定形状,但是超时了。因为时间复杂度是 n 4 n^4 n4

所以采用了下面这种办法。

以图片中的矩形为例,n=4, m=6

长为1宽为1的矩形在第一行有6个,有4行.所以总的有 4 × 6 4 \times 6 4×6个.也就是 ( n − 0 ) × ( m − 0 ) (n-0) \times (m-0) (n0)×(m0)
在这里插入图片描述

长为2宽为1的矩形在第一行有5个,有4行.所以总的有 4 × 5 4 \times 5 4×5个.也就是 ( n − 1 ) × ( m − 1 ) (n-1) \times (m-1) (n1)×(m1)
在这里插入图片描述

在这里插入图片描述

#include <stdio.h>

int main(){
	int n, m; //n is line ; m is column
	scanf("%d %d", &n, &m);
	long long square_num=0, rectangle_num=0;
	
	int x,y;
	for(x=0; x<n; x++){			//行 长
		for(y=0; y<m; y++){		//列 宽
			if(x == y){
				square_num+=(n-x)*(m-y);
			}
			else{
				rectangle_num+=(n-x)*(m-y);
			}
		}
	}
	printf("%lld %lld",square_num,  rectangle_num);
	return 0;
}

注意:

尽可能的想象出结果以及各个数据的类型,避免数据溢出。

根据题设中的取值范围推演。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时屿.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值