一、题目描述
二、算法分析说明
暴力
n × m的格子共有:
①nm + (n - 1)(m - 1) + … + (n - m + 1) × 1,n ≥ m
②nm + (n - 1)(m - 1) + … + (m - n + 1) × 1,n ≤ m
个正方形。
显然式子的每一项分别代表边长为1,2,……,min(m, n)的正方形。
上述表达式可以推广到非正方形的情况。例如n × m(n ≥ m)的格子有长和宽分别为a,b(a ≠ b,a ≤ n,b ≤ m)的长方形共
(n - a + 1)(n - b + 1) + (n - a + 2)(n - b + 2) + … + (n - m + 1) × 1
个。
三、AC 代码
#include<cstdio>
#pragma warning(disable:4996)
unsigned long long n, m, ns, nr;
inline void s() {
for (unsigned long long i = n, j = m; i != 0 && j != 0; --i, --j) {
ns += i * j;
}
}
inline void r() {
for (unsigned long long N = 1; N <= n; ++N) {
for (unsigned long long M = 1; M <= m; ++M) {
if (N == M)continue;
nr += (n - N + 1) * (m - M + 1);
}
}
}
int main() {
scanf("%llu%llu", &n, &m);
s();
r();
printf("%llu %llu\n", ns, nr);
return 0;
}