[洛谷] 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 ,所有正方形的个数为 k=1t(nk+1)×(mk+1)

posted @   wKingYu  阅读(133)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
欢迎阅读『[洛谷] P2241 统计方形(数据加强版)』
点击右上角即可分享
微信分享提示