1997年普及组第一题
有一个n*m方格的棋盘,求其方格包含多少正方形、长方形
n,m因为原来数据太弱,现规定m小于等于5000,n小于等于5000(原来是100,100)
方格包含多少正方形、长方形
输入
2 3
输出
8 10
这里要我们求方格中包含的正方形和长方形的个数,首先这其实可以转化为一道我们小学奥数中的数学问题。
对于一个n×m的棋盘,我们要求其中的矩形个数(正方形+长方形)有公式如下:
而对于一个n×n的棋盘,我们要求其中的正方形个数有如下公式:
那么对于n×m的棋盘,我们要求其中的正方形个数有如下公式:
其中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;
}