原题链接(洛谷):https://www.luogu.com.cn/problem/P1548
原题markdown:
# [NOIP1997 普及组] 棋盘问题
## 题目描述
设有一个$N \times M$方格的棋盘$(1≤N≤100,1≤M≤100)$
求出该棋盘中包含有多少个正方形、多少个长方形(不包括正方形)。
例如:当 $N=2, M=3$时: ![](https://cdn.luogu.com.cn/upload/pic/310.png)
正方形的个数有$8$个:即边长为$1$的正方形有$6$个;
边长为$2$的正方形有$2$个。
长方形的个数有$10$个:
即
$2 \times 1$的长方形有$4$个 ![](https://cdn.luogu.com.cn/upload/pic/311.png)
$1 \times 2$的长方形有$3$个: ![](https://cdn.luogu.com.cn/upload/pic/312.png)
$3 \times 1$的长方形有$2$个: ![](https://cdn.luogu.com.cn/upload/pic/313.png)
$3 \times 2$的长方形有$1$个: ![](https://cdn.luogu.com.cn/upload/pic/314.png)
如上例:输入:$2,3$
输出:$8,10$
## 输入格式
$N,M$
## 输出格式
正方形的个数与长方形的个数
## 样例 #1
### 样例输入 #1
```
2 3
```
### 样例输出 #1
```
8 10
```
## 提示
**【题目来源】**
NOIP 1997 普及组第一题
题解1(四层for循环):
#include<bits/stdc++.h>
using namespace std;
int m, n, cntZ, cntC;
int main() {
cin >> n >> m;
for (int i = 0; i <= n; i++)
for (int j = 0; j <= m; j++)
for (int k = i + 1; k <= n; k++)
for (int l = j + 1; l <= m; l++) {
if (k - i == l - j) cntZ++;
else cntC++;
}
cout << cntZ << ' ' << cntC;
return 0;
}
题解2(2层for循环)(非原创,由cyx编写):
#include <iostream>
using namespace std;
long long n, m, sum1 = 0, sum2 = 0, f;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
f = (n - i + 1) * (m - j + 1);
if (i == j) {
sum1 += f;
} else {
sum2 += f;
}
}
}
cout << sum1 << " " << sum2;
return 0;
}
没有回复内容