在解决这个问题时,我们需要用到几个数学公式来计算在一个 n × m 的棋盘上正方形和长方形的数量。
计算步骤
计算正方形的数量:
对于一个边长为 k 的正方形,其数量可以通过选择其左上角来计算。
边长为 k 的正方形可以在 (n-k+1) × (m-k+1) 个位置出现。
所以正方形的总数是:
正方形数量
计算所有可能的长方形的数量:
任何长方形可以通过选择其左上角 (r1, c1) 和右下角 (r2, c2) 来定义。
可以使用组合数学的方法来计算长方形的总数:
计算不包含正方形的长方形的数量:
从总的长方形数量中减去正方形的数量:
长方形(不包含正方形)数量=长方形数量−正方形数量
C++ 实现
以下是用 C++ 编写的解决方案:
#include <iostream>
using namespace std;
// 计算正方形的数量
long long countSquares(int n, int m) {
long long totalSquares = 0;
int minSide = min(n, m);
for (int k = 1; k <= minSide; ++k) {
totalSquares += (long long)(n - k + 1) * (m - k + 1);
}
return totalSquares;
}
// 计算所有长方形的数量
long long countRectangles(int n, int m) {
long long totalRectangles = (long long)n * (n + 1) / 2 * (m * (m + 1) / 2);
return totalRectangles;
}
int main() {
int n, m;
cin >> n >> m;
}
代码解释
countSquares 函数:
计算正方形的数量。通过遍历所有可能的边长 k,并计算每个边长 k 的正方形数量。
countRectangles 函数:
计算所有长方形的数量。使用数学公式直接计算。
main 函数:
读取输入的 n 和 m。
调用 countSquares 和 countRectangles 函数计算正方形和长方形的数量。
输出结果,包括正方形的数量和不包含正方形的长方形的数量。
这个实现确保了在给定的时间限制内完成计算,并且可以处理较大的棋盘尺寸。