列表

详情


NC342. 格点三角形

描述

牛牛最近在研究三角形计数问题。
它认为,满足以下三个条件的三角形是“好三角形”。
1. 三角形的三个顶点均为格点,即横坐标和纵坐标均为整数。
2. 三角形的是直角三角形,且两条直角边平行于 x 轴和 y 轴 。
honoka想知道,在平面中选取一个大小为 的矩形格点阵,可以找到多少个不同的“好三角形”?由于答案可能过大,请对 1000000007 取模。

示例1

输入:

2,3

输出:

12

说明:

如上图,共有2行3列格点。面积为0.5的直角三角形有8个:ABD、ABE、ADE、BDE、BCE、BCF、BEF、CEF。
如上图,面积为1的直角三角形有4个:ACD、ADF、ACF、DCF
因此共有12个符合条件的直角三角形。
请注意,ACE和BDF虽然也是直角三角形,但由于直角边并不是平行于 x 轴或 y 轴,所以并不合法 。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 3ms, 内存消耗: 392KB, 提交时间: 2022-06-26

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 返回满足条件的格点直角三角形数量
 * @param n int整型 格点的行数
 * @param m int整型 格点的列数
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int getNums(int n, int m ) {
    if (n < 2 || m < 2) {
        return 0;
    }
    long ln = n, lm = m;
    long long nSum = (ln * (ln - 1)) / 2 % 1000000007;
    long long mSum = (lm * (lm - 1)) / 2 % 1000000007;
    long long result = nSum * mSum % 1000000007;
    return (result * 4) % 1000000007;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-03-08

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回满足条件的格点直角三角形数量
     * @param n int整型 格点的行数
     * @param m int整型 格点的列数
     * @return int整型
     */
    int getNums(int n, int m) {
        // write code here
        int mod=1e9+7;
        return 1ll*n*m%mod*(n-1)%mod*(m-1)%mod;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 412KB, 提交时间: 2022-05-21

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回满足条件的格点直角三角形数量
     * @param n int整型 格点的行数
     * @param m int整型 格点的列数
     * @return int整型
     */
    int getNums(int n, int m) {
        const int mod = 1000000007;
        return n * (n - 1LL) % mod * m % mod * (m - 1) % mod;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 420KB, 提交时间: 2022-06-26

class Solution {
  public:
    int getNums(int n, int m) {
        return 1ll * n * m % 1000000007 * (n - 1) % 1000000007 * (m - 1) % 1000000007;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 440KB, 提交时间: 2022-07-18

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回满足条件的格点直角三角形数量
     * @param n int整型 格点的行数
     * @param m int整型 格点的列数
     * @return int整型
     */
    int getNums(int n, int m) {
        // write code here
      // 边长
      n --, m --;
      typedef long long LL;
      static constexpr int p = 1000000007;
      // 底边取不同长度时的位置 m + m - 1 + .. + 1 ==> m * (m + 1) / 2
      // 底边在不同行时,高可能的取值 n + n - 1 +... + 1 ==> n * (n + 1) / 2
      // 上下,正反 4 种不同的三角形位置
      LL res = 1ll * m  * (m + 1) % p * n %p * (n + 1) % p;
      return res;
    }
};

上一题