[洛谷] P2241 统计方形(数据加强版)

image


点击查看代码
#include<bits/stdc++.h>
using namespace std;

long long n, m, total, sum1, sum2;
int main()
{
    cin >> n >> m;
    int min_mn = min(m ,n);
    for (int i = 1; i <= min_mn; i++) {
        sum1 += (n - i + 1) * (m - i + 1);
    }
    cout << sum1 << " ";
    total = ((n + 1)  * n / 2) * ((m + 1) * m / 2);
    cout << total - sum1;
    return 0;
}


有两种解题思路,一种是推导出正方形个数和长方形个数的公式,一种是通过枚举。这里给出数学公式的推导思路。

所有可能的矩形个数:任意的一个矩形都是由上下左右四条边组成,对于 n × m 的方格,横边共有 n + 1 条,竖边共有 m + 1 条,从横边中选择两条,从竖边中选择两条即可组成矩形,横边的选择有 n × (n + 1) / 2 个,竖边的选择有 m × (m + 1) / 2 个,故所有矩形的个数为 n × (n + 1) / 2 × m × (m + 1) / 2

正方形的个数:假定正方形的边长为 k , 则所有边长为 k 的正方形个数可以看成是一个 k × k 的正方形从左上角开始向右一格一格地移动,当走到行末时,再从下一行的第一个格子往右移动,当格子在一行内移动时,所有可能的个数为 m - k + 1 ,同理,当格子在一列内移动时,所有可能的个数为 n - k + 1 ,所有满足题干条件的正方形边长应同时小于 n 和 m ,故取 n 和 m 中的最小者为 t ,所有正方形的个数为 \({\sum }^{t}_{k=1}(n-k+1)\times (m-k+1)\)

posted @ 2022-04-10 14:57  wKingYu  阅读(97)  评论(0编辑  收藏  举报