P2241 统计方形(数据加强版)

题目传送门

题目描述

题目背景

1997年普及组第一题

题目描述

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

输入格式

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

输出格式

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

输入输出样例

输入 #1复制

2 3

输出 #1复制

8 10

算法求解

分析

首先要明白一点

正方形数量 + 长方形数量 = 矩形数量

以上是2*3的一个矩形

我们固定右下角,比如在(2,3)

以(2,3)为右下角的正方形数量为:min(2,3)

以(2,3)为右下角的矩形数量为:2*3


易得,对于(i,j)

  • 以(i,j)为右下角的正方形数量为:min(i,j)
  • 以(i,j)为右下角的矩形数量为:i*j

所以对所有右下角求和,求出所有正方形数量和矩形数量

长方形数量 = 矩形数量- 正方形数量

注意,结果较大,用long long 存储

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 5010;
int n, m;
LL sumZ = 0; // 正方形个数 
LL sumC = 0; // 所有矩形个数 
int main()
{
	scanf("%d%d",&n, &m);
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			{
				sumZ += min(i, j);
				sumC += i*j; 
			}	
	cout << sumZ << " " << sumC - sumZ << endl;
	return 0;
} 

时间复杂度

O(n+m)

参考文章

https://www.luogu.com.cn/blog/NKU-lsroi/solution-p2241

posted @ 2022-02-28 21:37  VanHope  阅读(110)  评论(0编辑  收藏  举报