题目描述
有一个
n
×
m
n\times m
n×m 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。
输入格式
一行,两个正整数
n
,
m
(
n
≤
5000
,
m
≤
5000
)
n,m(n \leq 5000,m \leq 5000)
n,m(n≤5000,m≤5000)
输出格式
一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。
输入输出样例
输入
2 3
输出
8 10
首先可以暴力过
代码:
#pragma warnign(disable:4996)
#include<stdio.h>
#define max(a, b) (a > b ? a : b)
long long n, ans1, ans2, m;
int main(){
scanf("%lld%lld", &n, &m);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(i == j)ans1 += (n - i + 1)*(m - j + 1);
else ans2 += (n - i + 1)*(m - j +1);
}
}
printf("%lld %lld", ans1, ans2);
return 0;
}
因为所有矩形数之和为 C n + 1 2 C m + 1 2 C^{2}_{n + 1}C^{2}_{m + 1} Cn+12Cm+12,所以引出第二种求法
#include<cstdio>
#define min(a, b) (a < b ? a : b)
long long n, m, ans, ans2;
int main() {
scanf("%lld%lld",&n,&m);
ans=((m+1)*m/2)*((n+1)*n/2);
int minnm = min(n, m);
for(int i=1; i<= minnm; i++) {
ans2+=(m-i+1)*(n-i+1);
}
printf("%lld %lld", ans2, ans-ans2);
return 0;
}
证明一下为什么是
C
n
+
1
2
C
m
+
1
2
C^{2}_{n + 1}C^{2}_{m + 1}
Cn+12Cm+12:
长
n
n
n 宽
m
m
m 的方格可以看做
n
+
1
n + 1
n+1个点
算了,我之后去visio搞张图,先放草稿里面