先上链接:P2241 统计方形(数据加强版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题目,考察的是数学与枚举。
题干是:
我们不难想到一个式子: 矩形个数=正方形个数+长方形个数。
这里分享一个从洛谷《深入浅出-基础篇》学习到的方法:
枚举右下角!!
我们先上一张图片:
如图所示:红色的是坐标(i,j) 橙色的是以该坐标为右下角的正方形个数,(1,1)有一个
(2,2)有2个 这里只列举了一些,可以自行推理剩余的。
所以我们可以得到: 在这样一个表格中,以某一点(i,j)为右下角的正方形的个数为 min(i,j)
矩形个数看下图:
我们可以发现:以(i,j)为右下角的矩形个数为 i*j。
那么长方形,正方形的个数就跃然于纸上了。
上代码:
long long n, m;
long long arr[5005][5005];
int main()
{
long long sum = 0;
long long ans = 0;
cin >> n >> m;
for(int i=1;i<=n;i++)
for (int j = 1; j <= m; j++)
{
sum += i * j;
ans += min(i, j);
}
cout << ans<<' ' << sum - ans;
}