题解:三角形分类:底为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);
}
}
求余结论:
- 若
x+y=n
,则((x%m)+(y%m))%m=n%m
- 若
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大数总结:
- 包:
java.math
- 类:
BigInteger
、BigDecimal
- 作用:处理包含任意长度数字序列的数值
- 区别:
BigInteger
实现任意精度的整数计算,BigDecimal
实现任意精度的浮点数计算
常用方法:
整数:
static BigInteger valueOf(BigInteger other)
:将普通的数值转换为大数值BigInteger add(BigInteger other)
:实现大数相加BigInteger multiply(BigInteger other)
::实现打数相乘BigInteger subtract(BigInteger other)
:实现打数相减BigInteger divide(BigInteger other)
:实现大数相除BigInteger mod(BigInteger other)
:实现大数求余
注:不能用算数运算符处理大数值BigInteger compareTo(BigInteger other)
:实现大数比较,若两个大数相同则返回0,小于则返回负数,大于则返回正数
浮点数:
BigDecimal divide(BigDecimal other, RoundingMode roundingMode)
:浮点数相除需要提供舍入方式,RoundingMode.HALF_UP
是常用的四舍五入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)