统计方形(数据加强版)
题目背景
1997年普及组第一题
题目描述
有一个 n × m n \times m n×m 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。
输入格式
一行,两个正整数 n , m n,m n,m( n ≤ 5000 , m ≤ 5000 n \leq 5000,m \leq 5000 n≤5000,m≤5000)。
输出格式
一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。
样例 #1
样例输入 #1
2 3
样例输出 #1
8 10
本来想的是通过四个坐标确定形状,但是超时了。因为时间复杂度是 n 4 n^4 n4。
所以采用了下面这种办法。
以图片中的矩形为例,n=4, m=6
长为1宽为1的矩形在第一行有6个,有4行.所以总的有
4
×
6
4 \times 6
4×6个.也就是
(
n
−
0
)
×
(
m
−
0
)
(n-0) \times (m-0)
(n−0)×(m−0)个
长为2宽为1的矩形在第一行有5个,有4行.所以总的有
4
×
5
4 \times 5
4×5个.也就是
(
n
−
1
)
×
(
m
−
1
)
(n-1) \times (m-1)
(n−1)×(m−1)个
#include <stdio.h>
int main(){
int n, m; //n is line ; m is column
scanf("%d %d", &n, &m);
long long square_num=0, rectangle_num=0;
int x,y;
for(x=0; x<n; x++){ //行 长
for(y=0; y<m; y++){ //列 宽
if(x == y){
square_num+=(n-x)*(m-y);
}
else{
rectangle_num+=(n-x)*(m-y);
}
}
}
printf("%lld %lld",square_num, rectangle_num);
return 0;
}
注意:
尽可能的想象出结果以及各个数据的类型,避免数据溢出。
根据题设中的取值范围推演。