top1编程
← 返回题目
题解

统计方形

1 条题解

  • 0
    @ 2026-8-4 17:25:35

    解题思路

    分两步:

    1. 正方形数量:边长为 i 的正方形有 (n-i+1) × (m-i+1) 个,把 i 从 1 到 min(n,m) 累加。
    2. 所有矩形数量:在 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)。

    • 1