P2241 统计方形(数据加强版)【数学问题、暴力枚举】

题目背景

1997年普及组第一题

题目描述

有一个n*m方格的棋盘,求其方格包含多少正方形、长方形

输入格式

n,m因为原来数据太弱,现规定m小于等于5000,n小于等于5000(原来是100,100)

输出格式

方格包含多少正方形、长方形

输入输出样例

输入

2 3

输出

8 10

解题思路:

这里要我们求方格中包含的正方形和长方形的个数,首先这其实可以转化为一道我们小学奥数中的数学问题。

对于一个n×m的棋盘,我们要求其中的矩形个数(正方形+长方形)有公式如下:

\left ( 1+2+3+...+n \right )\times\left ( 1+2+3+...+m \right ) = \frac{\left ( n+1 \right )\times n}{2}\times \frac{\left ( m+1 \right )\times m}{2}

而对于一个n×n的棋盘,我们要求其中的正方形个数有如下公式:

1\times 1+2\times2+3 \times 3+...+n\times n

那么对于n×m的棋盘,我们要求其中的正方形个数有如下公式:

\sum\left ( n-i+1 \right )\left ( m-i+1 \right )

其中i从1到min(n,m)。

而对于该题中的长方形,我们只需要求出矩形个数x和正方形个数y,然后长方形个数:x-y

代码:

#include
#include
using namespace std;
#define ll long long
ll n, m;

int main()
{
	scanf("%d%d", &n, &m);
	ll x = (n + 1)*n / 2 * (m + 1)*m / 2;
	ll p = min(n, m);
	ll y = 0;
	for (ll i = 1; i <= p; i++)
	{
		y = y + (n - i + 1)*(m - i + 1);
	}
	printf("%lld %lld\n", y, x - y);
	return 0;
}

 

你可能感兴趣的:(洛谷,暴力枚举)