牛客--好三角形(BigInteger)

该博客探讨了一道编程题目,涉及在给定的N*M网格中找到不同类型的三角形数量。三角形分为底为2和底为1的两类,并详细分析了每种类型在平行于X轴和Y轴的情况。博主提供了两种解法,一种利用数学余数的结论,另一种通过Java中的BigInteger进行大数运算。讲解了BigInteger的主要方法,如加减乘除和取余,并提醒注意不能直接使用算术运算符处理大数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

题解:三角形分类:底为2高为1或者底为1高为2,N*M个结点的矩形
底为2:平行于X轴:每行可以有(M-2)条底,最近的上面的M个格点均可为顶点,最上方的一行格点没有向上的格点可以作为
顶点,故共有(N-1)行,顶点向下情况相同。
平行于Y轴,(N-2)条底,(M-1)行
两种情况共有(M-2)×M×(N-1)×2+(N-2)×N×(M-1)×2=2×(m+n-2)
底为1:平行于X轴:每行可以有(M-1)条底,相隔两行的M个格点均可为顶点,最上方的两行格点没有向上的格点可以作为顶
点,故共有(N-2)行,顶点向下情况相同。
平行于Y轴,(N-1)条底,(M-2)行
两种情况共有(M-1)×(M-2)×(N-2)(消除与底为2的三角形的重合情况)×2+(N-1)×(N-2)×(M-2)×2=2×m×n-3×m-3×n+4

解法一

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        long mod= (long) (1e9+7);
        long n=scan.nextLong();
        long m=scan.nextLong();
        //乘一下求一次余
        long ans=2*((n-2)*(n-2)%mod*(m-1)%mod+(m-2)*(m-2)%mod*(n-1)%mod+(n-1)*n%mod*(m-2)%mod+(m-1)*m%mod*(n-2)%mod)%mod;
        System.out.println(ans);
    }
}

求余结论:

  1. x+y=n,则((x%m)+(y%m))%m=n%m
  2. x*y=n,则((x%m)*(y%m))%m=n%m

解法二:JAVA大数

import java.math.BigInteger;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        BigInteger n = scan.nextBigInteger(), m = scan.nextBigInteger();
        BigInteger TWO = new BigInteger("2");
        n = n.subtract(BigInteger.ONE); m = m.subtract(BigInteger.ONE);
        BigInteger res = (m.add(n)).multiply(TWO).multiply(m.multiply(n).multiply(TWO).subtract(m).subtract(n)).mod(new BigInteger("1000000007"));
        System.out.println(res);
    }
}

JAVA大数总结

  1. 包:java.math
  2. 类:BigIntegerBigDecimal
  3. 作用:处理包含任意长度数字序列的数值
  4. 区别:BigInteger实现任意精度的整数计算,BigDecimal实现任意精度的浮点数计算

常用方法:

整数:

  1. static BigInteger valueOf(BigInteger other):将普通的数值转换为大数值
  2. BigInteger add(BigInteger other):实现大数相加
  3. BigInteger multiply(BigInteger other)::实现打数相乘
  4. BigInteger subtract(BigInteger other):实现打数相减
  5. BigInteger divide(BigInteger other):实现大数相除
  6. BigInteger mod(BigInteger other):实现大数求余
    注:不能用算数运算符处理大数值
  7. BigInteger compareTo(BigInteger other):实现大数比较,若两个大数相同则返回0,小于则返回负数,大于则返回正数

浮点数:

  1. BigDecimal divide(BigDecimal other, RoundingMode roundingMode):浮点数相除需要提供舍入方式,RoundingMode.HALF_UP是常用的四舍五入
  2. BigDecimal divide(BigDecimal other, int x):返回值为 o t h e r other other o t h e r / 1 0 x ) other/10^x) other/10x)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值