1. 程式人生 > 其它 >P2241 統計方形題解

P2241 統計方形題解

解題思路:

1、正方形

我們以\((3,2)\)為圖形右下角端點進行解釋,這時可以構成的正方形共兩個,一個是邊長為\(1\)的,另一個是條邊為\(2\)的,沒有其它的了。為什麼\((3,2)\)兩個數字,一個是\(3\),一個是\(2\),結果受限於後面的\(2\),而無法突破呢?因為要照顧短的嘛。所以此時正方形個數=\(min(x,y)\)個。

2、矩形

用筆畫一下,就知道,一個長為\(3\),寬度為\(2\)的矩形,以現有右下角端點為右下角端點的子矩形個數是\(3 \times 2=6\)個,所以矩形個數=\(x \times y\)個。

3、長方形

\(長方形個數=矩形個數-正方形個數\)

二、C++程式碼

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;

/**
 母題:P1548
 一、算正方形的個數
列舉每一個格子,看以它為左上角的矩形共有多少個(正方形與長方形同屬於矩形)

二、算長方形個數(矩形=長方形+正方形)
1.其實算長方形並不常見,但算矩形大家應該經常遇到,所以如果你會算矩形,再聯絡第一個問題,那答案就轉化為 矩形個數-正方形個數.
2.像求解正方形個數一樣,固定矩形右下角(i,j),顯然此時矩形個數為i*j.
3.同理,求和即可.然後,再減去正方形的個數就是長方形的個數啦。
*/
LL n, m, s1, s2;

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            s1 += min(i, j);//也可以理解為左上角
            s2 += i * j;    //也可以理解為左上角開始,也是一樣的
        }
    cout << s1 << " " << s2 - s1 << endl;
    return 0;
}