题解
统计方形
1 条题解
-
0
解题思路
分两步:
- 正方形数量:边长为 i 的正方形有
(n-i+1) × (m-i+1)个,把 i 从 1 到 min(n,m) 累加。 - 所有矩形数量:在 n×m 棋盘里,竖着选两行、横着选两列就围成一个矩形,总数是
n(n+1)/2 × m(m+1)/2。
长方形 = 所有矩形 - 正方形。
参考代码
#include <iostream> using namespace std; int main() { long long n, m; cin >> n >> m; // 所有子矩形数 = n(n+1)/2 * m(m+1)/2 long long rect = n * (n + 1) / 2 * m * (m + 1) / 2; long long square = 0; long long t = (n < m) ? n : m; // 边长为i的正方形有 (n-i+1)*(m-i+1) 个 for (long long i = 1; i <= t; i++) { square += (n - i + 1) * (m - i + 1); } cout << square << " " << rect - square << endl; // 长方形 = 总数 - 正方形 return 0; }复杂度分析
循环 min(n,m) 次,时间复杂度 O(min(n,m)),额外空间复杂度 O(1)。
- 正方形数量:边长为 i 的正方形有
- 1