洛谷[P2241 统计方形(数据加强版)]
题目背景
1997年普及组第一题
题目描述
有一个n*m方格的棋盘,求其方格包含多少正方形、长方形
输入格式
n,m因为原来数据太弱,现规定m小于等于5000,n小于等于5000(原来是100,100)
输出格式
方格包含多少正方形、长方形
输入输出样例
输入
2 3
输出
8 10
解题思路
样例分析
正方形:
1、边长为1,个数为(n-0)(m-0)=6。
2、边长为2,个数为(n-1)(m-1)=2。
故若有nm个方格,取边长为a的正方形,那么边长为a的正方形的个数为(n-(a-1))(m-(a-1))。
长方形
1、长度i为1,宽度为j=2,个数为(n-0)(m-1)=2×2=4。
2、长度i为2,宽度为j=1,个数为(n-1)(m-0)=1×3=3。
故若有nm个方格,取长为a,宽为b,那么长为a宽为b的长方形的个数为(n-(a-1))(m-(b-1))。
具体实现见代码:
完整代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll zheng,chang;
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=0 ;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
if(i==j) zheng+=(n-i)*(m-j);//正方形个数 ,正方形边长为i+1
else chang+=(n-i)*(m-j);//长方形个数 ,长方形长为j+1(横向),宽为i+1(纵向)
}
}
printf("%lld %lld",zheng,chang);
return 0;
}