矩形内方形与长方形的个数

矩形(n*m)内所有小矩形的个数:1/4*n*(n+1)*m*(m+1)

推导:

一条长度为n的线段包含多少条长度为r的线段?(n-r+1)个

以n=11,r=3举例:

移动到最后,发现1到9<11-3+1>都可以找到长度为3的线段

所以一条长度为n的线段包含(n-r+1)个长度为r的线段

如果想知道<n*m的矩形中能找出多少个1*3的矩形>似乎只需要弄明白<长度为n的线段能找出多少个长度为1的线段>和<长度为m的线段能找出多少个长度为3的线段>这两个问题,它们的答案分别是(n-1+1)和(m-3+1),所以<n*m的矩形中能找出多少个1*3的矩形>的答案是(n-1+1)*(m-3+1)

回到问题,<n*m的矩形中能找出多少个矩形>

只需要找出<n中包含的1~n的线段的总数>、<m中包含的1~m的线段的总数>,n中包含长度为1的线段数目是(n-1+1),长度为2的线段数目是(n-2+1)...根据等差数列前n项和,我们可以求出,<n中包含的1~n的线段的总数>为1/2*n*(n+1),同理<m中包含的1~m的线段的总数>为1/2*m*(m+1)

所以<n*m的矩形中能找出多少个矩形>答案是1/4*n*(n-1)*m*(m-1)

正方形的个数:

long long int sq=0;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++){
        sq+=min(i,j);
    }

i,j是矩形的坐标,也是寻找的正方形的右下角的坐标。将每个坐标的左上角的正方形全部加起来得到所有正方形的个数

所有矩形的个数减去正方形的个数即为长方形的个数

#include<bits/stdc++.h>
using namespace std;
int n,m;
int main()
{
    cin>>n>>m;
    long long int all=(0.25*n*(n+1)*m*(m+1));
    long long int sq=0;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++){
        sq+=min(i,j);
    }
    cout<<sq<<' '<<all-sq;
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Wyatt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值