#include <iostream>
#define int long long
using namespace std;
signed main() {
int n, m;
cin >> n >> m;
int k = min (n, m), cnt_zheng = 0;
for (int i = 1; i <= k; i++)
cnt_zheng += (n - i + 1) * (m - i + 1);
cout << cnt_zheng << " " << (1 + n) * n * (1 + m) * m / 4 - cnt_zheng;
}
但,仅限于此吗?
把求正方形的循环给展开。
cnt=m\times n+(m-1)\times (n-1)+(m-2)\times (n-2)+...(m-k+1)\times (n-k+1)=mn+(mn-n-m+1)+(mn-2n-2m+4)+\dots+(mn-mk+m-kn+k^2-k+n-k+1)
我们发现($1\le i\le k$):
+ 每一项都有一个 $+mn$;
+ 第 $i$ 项有一个 $-(i-1)(n+m)$;
+ 每个 $i$ 也有 $+(i-1)^2$。
所以:
+ 总共有 $k$ 个 $+mn$;
+ 有 $\frac{k\times (k-1)}{2}$ 个 $-(n+m)$;
+ $i$ 取 $1\dots k$,每个 $(i-1)^2$ 相加。
最后这个怎么计算?~~于是我去百度了一下。~~
还真有这个公式。对于前 $x$ 项的平方和,结果为 $\frac{x(x+0.5)(x+1)}{3}$。想深入了解的请自行百度QWQ,~~因为我太菜了也不会~~。
然后就好求啦,把三个值相加就行了。
理论上时间复杂度 $O(1)$。
```
#include <iostream>
#define int long long
using namespace std;
signed main() {
int n, m;
cin >> n >> m;
int k = min (n, m), cnt_zheng = m*n*k - k*(k-1)/2*(m+n) + (k-1)*(k-0.5)*k/3;
cout << cnt_zheng << " " << (1 + n) * n * (1 + m) * m / 4 - cnt_zheng;
}
```
由于检查的不是很仔细,可能会出现一些语言或者公式上的问题,如果发现欢迎提出,谢谢。
------------
还有什么不理解的或者想挑刺的欢迎提出QAQ。