Java B组蓝桥杯第十届国赛:数正方形
试题 G: 数正方形
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
在一个 N × N 的点阵上,取其中 4 个点恰好组成一个正方形的 4 个顶点,
一共有多少种不同的取法?
由于结果可能非常大,你只需要输出模 10^9 + 7 的余数。
如上图所示的正方形都是合法的。
【输入格式】
输入包含一个整数 N。
【输出格式】
输出一个整数代表答案。
【样例输入】
4
【样例输出】
20
【数据规模与约定】
对于所有评测用例,2 ≤ N ≤ 1000000。
思路:假设N个点的边长为N-1,比如4个点的正方形边长为3,那么最小的正方形边长即为1x1
从边长1x1的正方形开始数,直到最大的正方形,即(N-1)x(N-1),需要注意:这里对于边长不同的正方形的个数计算中,包含该大小正方形所独有的正方形
例如,上图对于边长3x3正方形的个数计算中,除了最大的3x3的正方形,还有其特有的两个正方形
例如,上图对于边长2x2正方形的个数计算中,除了最大的2x2的正方形,还有其特有的1个正方形
不难想象,对于某个nxn的正方形,其特有的正方形个数为n-1,加上该nxn的正方形,共有n个正方形
1.边长1x1,个数(N-1)x(N-1)
2.边长2x2,个数2x(N-2)x(N-2)
3.边长3x3,个数3x(N-3)x(N-3)
…
边长(N-1)x(N-1),个数(N-1)x1x1
相加,得到公式:
(
N
−
1
)
2
+
2
∗
(
N
−
2
)
2
+
3
∗
(
N
−
3
)
2
+
.
.
.
+
(
N
−
1
)
∗
1
2
.
(N-1)^{2}+2*(N-2)^{2}+3*(N-3)^{2}+...+(N-1)*1^{2}.
(N−1)2+2∗(N−2)2+3∗(N−3)2+...+(N−1)∗12.
代码:(Python)
N = int(input())
res = 0
for i in range(N-1):
res+=pow((N-(i+1)),2)*(i+1)
res= res%1000000007
print(res)
代码:(Java)
import java.util.Scanner;
public class Blue
{
public static void main (String[] args)
{
Scanner scanner = new Scanner(System.in);
long N = scanner.nextLong();
long res = 0;
for (int i = 0; i < N-1; i++) {
res+=(N-(i+1))*(N-(i+1))*(i+1);
res= res%1000000007;
}
System.out.println(res);
}
}