3033 矩形的数量1.0 秒 131,072.0 KB 10 分 初学者2级题一个m乘n的方格图,有多少个矩形。
例如:4*3的方格中共有60个矩形。
1x1 共 12 个
1x2 共 8 个
1x3 共 4 个
2x1 共 9 个
2x2 共 6 个
2x3 共 3 个
3x1 共 6 个
3x2 共 4 个
3x3 共 2 个
4x1 共 3 个
4x2 共 2 个
4x3 共 1 个
输入共一行:2个数m,n,对应方格图的长宽(1 <= m, n <= 1e9)输出对应的矩形数量。(答案对10^9+7取模)数据范围1 <= m, n <= 1e9
输入样例
4 3
输出样例
60
首先想到使用m*n的数组,一段一段的试,随即想到其中的计算数量肯定很大,便开始研究例子,发现存在一定规律:
即从1到m分别乘以1到n,很明显的两层for循环
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
long sum = 0;
for (int i = 1; i <= m; i++) {
for (int j = 1,s = i; j <= n; j++,s+=i) {
sum+=s;
}
}
System.out.println(sum%1000000007);
}
}
但提交之后发现超时,随即返回查看题目,发现所给的数最大1e9,使用for循环遍历肯定超时,出题不可能无解,便想到公式,思虑良久,发现了其中端倪
由例子可以看出,三个m变一次,分别乘以1到n,此时1到n便可简化为(1+n)*n/2(前n和公式-首项加末项乘以项数除以二),缩小了n的项数便发现m也可以化简,答案便出来了
前n和 乘法交换法则
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long m = sc.nextLong();
long n = sc.nextLong();
long mod = 1000000007;
long sum = ((1+n)*n/2%mod)*((1+m)*m/2%mod);
System.out.println(sum%mod);
}
}