#zHSXybttg060608. 1655:数三角形

1655:数三角形

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

给定一个 n×mn \times m 的网格(注意:题目输入是 mmnn,但通常理解网格为 nnmm 列,格点有 (n+1)(n+1)(m+1)(m+1) 列),请计算三点都在格点上的三角形共有多少个。三角形的三点不能共线。

示例:下图是一个 4×44\times 4 网格(即 n=4,m=4n=4,m=4,格点矩阵为 5×55\times 5)上的一个三角形。


(注:此处原题有图,表示三个格点构成三角形)


输入格式

输入一行,包含两个空格分隔的正整数 mmnn

注意:这里 mmnn 表示横向 mm 段、纵向 nn 段,因此格点矩阵为 (m+1)×(n+1)(m+1)\times (n+1) 个点。


输出格式

输出一个正整数,为所求三角形数量。


样例

样例输入 1

2 2

样例输出 1

76

样例解释 1

m=2,n=2m=2, n=2,格点为 (3×3)(3\times 3)99 个点。

三角形总数 = 任选三点 - 三点共线的方案数。

  • 任选三点:C(9,3)=84C(9, 3) = 84

  • 三点共线的情况:

    1. 水平线:33 条横线,每条 33 个点,共 3×C(3,3)=3×1=33 \times C(3,3) = 3\times 1=3
    2. 竖直线:33 条竖线,每条 33 个点,共 3×1=33\times 1=3
    3. 斜线(斜率正负):
      • 主对角线(从 (0,0)(0,0)(2,2)(2,2)):3个点,C(3,3)=1C(3,3)=1
      • 反对角线(从 (0,2)(0,2)(2,0)(2,0)):3个点,C(3,3)=1C(3,3)=1
      • 其他斜线需要计算:例如斜率 1/21/22/12/1 在这个小网格中不存在超过2个格点,所以不考虑。

    所以共线数 =3+3+1+1=8= 3 + 3 + 1 + 1 = 8

三角形数 =848=76= 84 - 8 = 76


数据范围

对于所有数据,1m,n10001 \le m, n \le 1000

注意:答案可能很大,需要使用 64 位整数(C++ 中用 long long)。


时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示

  1. 总点数为 (m+1)×(n+1)(m+1)\times (n+1)
  2. 任选三点方案数为 C(m+1)(n+1)3C_{(m+1)(n+1)}^3
  3. 三点共线情况包括:
    • 水平线:(n+1)×Cm+13(n+1) \times C_{m+1}^3
    • 竖直线:(m+1)×Cn+13(m+1) \times C_{n+1}^3
    • 斜线(斜率不为 0 或无穷):枚举向量 (dx,dy)(dx,dy)gcd(dx,dy)=1\gcd(dx,dy)=1,线段两端在网格内,中间有 kk 个格点,这样的线段有 (mdx+1)×(ndy+1)×2(m-dx+1)\times(n-dy+1)\times 2(考虑正负斜率),每个线段贡献 Ck+13C_{k+1}^3
  4. 斜线枚举 dx,dydx,dy11m,nm,n,复杂度 O(mn)O(mn) 可接受。