矩形(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;
}