洛谷P2241,统计方形

题目:
统计网格内正方形和长方形的个数。

思路:
统计所有矩形的个数,统计正方形的个数。然后减。
公式:
1.以某个格子为左上角的矩形个数:(n-i)*(m-j)
2.以某个格子为左上角的正方形个数:min(n-i, m-j)。
扩展:
在n*m的网格内的矩形个数:(n*(n+1)/2)*(m*(m+1)/2)。
证明过程是数学归纳法。找1*1,1*2,1*max(n,m)...的个数分别为多少然后数学归纳
https://www.cnblogs.com/workformylove/p/3745037.html --- 大佬证明过程。

链接:
https://www.luogu.com.cn/problem/P2241

 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define ctx cout << "xxxxx" << endl
#define inf 0x3f3f3f3f
const int INF = 0x3f3f3f3f;
const double pai = 3.141592653589;
const int maxn = 1e5 + 10;
int b[maxn];
int main()
{
int n, m;
cin >> n >> m;
ll cot1 = 0, cot2 = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
ll x = min(n-i, m-j);
ll sum = (n-i) * (m-j);
cot1 += x, cot2 += sum - x;
}
}
cout << cot1 << " " << cot2 << endl;
return 0;
}

posted @ 2021-06-24 21:56  李发?  阅读(150)  评论(0)    收藏  举报