1 solutions

  • 0
    @ 2026-5-19 19:23:23

    题目解析:网格中点为格点的线段计数

    这是一道经典的组合几何问题。我们需要在一个 (n+1)×(m+1)(n+1) \times (m+1) 的点阵中,寻找两端点均为格点且中点亦为格点的线段数量。


    1. 核心数学原理

    假设线段的两个端点坐标分别为 A(x1,y1)A(x_1, y_1)B(x2,y2)B(x_2, y_2),其中 0x1,x2n0 \le x_1, x_2 \le n0y1,y2m0 \le y_1, y_2 \le m

    根据中点公式,中点 MM 的坐标为:

    $$M = \left( \frac{x_1 + x_2}{2}, \frac{y_1 + y_2}{2} \right)$$

    若要求 MM 也是网格点(即坐标为整数),则必须满足:

    • x1+x2x_1 + x_2 是偶数     x1,x2\implies x_1, x_2 奇偶性相同
    • y1+y2y_1 + y_2 是偶数     y1,y2\implies y_1, y_2 奇偶性相同

    2. 解题思路:分类计数

    我们将所有网格点根据横纵坐标的奇偶性分为 4 类

    1. (偶, 偶)xx 是偶数,yy 是偶数
    2. (偶, 奇)xx 是偶数,yy 是奇数
    3. (奇, 偶)xx 是奇数,yy 是偶数
    4. (奇, 奇)xx 是奇数,yy 是奇数

    结论: 只有当两个端点属于同一种类型时,它们的中点才会在网格点上。

    步骤一:统计每种类型的点数

    0xn0 \le x \le n0ym0 \le y \le m 的范围内:

    • 横坐标中,偶数个数 Ex=n2+1E_x = \lfloor \frac{n}{2} \rfloor + 1,奇数个数 Ox=n2O_x = \lceil \frac{n}{2} \rceil
    • 纵坐标中,偶数个数 Ey=m2+1E_y = \lfloor \frac{m}{2} \rfloor + 1,奇数个数 Oy=m2O_y = \lceil \frac{m}{2} \rceil

    四种类型的点数分别为:

    • N00=Ex×EyN_{00} = E_x \times E_y
    • N01=Ex×OyN_{01} = E_x \times O_y
    • N10=Ox×EyN_{10} = O_x \times E_y
    • N11=Ox×OyN_{11} = O_x \times O_y

    步骤二:计算线段组合

    在每一类点中,我们任选两个不同的点即可构成一条满足条件的线段。对于点数为 kk 的类别,组合数为 Ck2C_k^2

    Count=k(k1)2\text{Count} = \frac{k(k-1)}{2}

    3. 代码实现 (C++)

    #include <bits/stdc++.h>
    
    using namespace std;
    using ll = long long;
    
    int main() {
        ll n, m;
        if (!(cin >> n >> m)) return 0;
    
        // x坐标中,偶数的个数和奇数的个数
        ll ex = n / 2 + 1;
        ll ox = (n + 1) / 2;
    
        // y坐标中,偶数的个数和奇数的个数
        ll ey = m / 2 + 1;
        ll oy = (m + 1) / 2;
    
        // 四种类型的点数
        ll n00 = ex * ey; // (偶, 偶)
        ll n01 = ex * oy; // (偶, 奇)
        ll n10 = ox * ey; // (奇, 偶)
        ll n11 = ox * oy; // (奇, 奇)
    
        // 计算每类点中选出2个点的组合数之和
        ll ans = 0;
        ans += n00 * (n00 - 1) / 2;
        ans += n01 * (n01 - 1) / 2;
        ans += n10 * (n10 - 1) / 2;
        ans += n11 * (n11 - 1) / 2;
    
        cout << ans << endl;
    
        return 0;
    }
    
    

    4. 样例验证

    样例 1: n=2,m=3n=2, m=3

    • x{0,1,2}    Ex=2,Ox=1x \in \{0, 1, 2\} \implies E_x=2, O_x=1

    • y{0,1,2,3}    Ey=2,Oy=2y \in \{0, 1, 2, 3\} \implies E_y=2, O_y=2

    • 点数统计:

    • N00=2×2=4    C42=6N_{00} = 2 \times 2 = 4 \implies C_4^2 = 6

    • N01=2×2=4    C42=6N_{01} = 2 \times 2 = 4 \implies C_4^2 = 6

    • N10=1×2=2    C22=1N_{10} = 1 \times 2 = 2 \implies C_2^2 = 1

    • N11=1×2=2    C22=1N_{11} = 1 \times 2 = 2 \implies C_2^2 = 1

    • 总数:6+6+1+1=146 + 6 + 1 + 1 = 14正确。


    复杂度分析

    • 时间复杂度O(1)O(1)。直接通过数学公式计算。
    • 空间复杂度O(1)O(1)。只使用了常数个变量。
    • 1

    Information

    ID
    27
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    # Submissions
    8
    Accepted
    3
    Uploaded By