2020牛客国庆集训派对day2 F-SUM OF SUB RECTANGLE AREAS

传送门:https://ac.nowcoder.com/acm/contest/7818/F

题意

给一个N * N的矩阵,每一位上都是1,求所有子矩阵的权值之和。

思路

$设n = 3;$ 考虑子矩阵大小为$i * j$的个数$x$,即该大小的所有子矩阵的权值为$x* i * j$。 $1 * 2$子矩阵:每行个数为$2$个,有$3$列,即总权值为$2 * 3 * (1 * 2)–2 * 3$为该矩阵在n*n矩阵中的个数,$1 * 2$为该子矩阵里的权值。 $2 3$子矩阵:每两行有$1$个,一共$2$个两行,权值为$2 3$,即总权值为$1 * 2 * 2 * 3$。

根据上面推导出:在$n*n$的矩阵中,有$i*j$子矩阵的个数为$(n - i + 1) * (n - j + 1)$,即总权值为$(n - i + 1) * (n - j + 1) * i * j$。 即总答案为: $$ans=\sum_{i=1}^n\sum_{j=1}^n(n - i + 1) * (n - j + 1) * i * j$$

$$ans=[\sum_{i=1}^n(n-i+1)i]^2$$

$$ans=[\frac{n^2(n+1)}{2}-\frac{n(n+1)(2n+1)}{6}+\frac{n(n+1)}{2}]^2$$

$$ans=[\frac{n * (n + 1)*(n+ 2)}{6}]^2$$

因为题目说会爆longlong,所以我这里用的是JAVA大数BigInteger,python也可(不过我不会)。

Code(71MS)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

import java.util.*;
import java.math.*;

public class Main
{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int T;
T = in.nextInt();
for(int i = 1;i <= T; i++) {
long n;
n = in.nextLong();
BigInteger ans = new BigInteger("1");
ans = ans.multiply(BigInteger.valueOf(n));
ans = ans.multiply(BigInteger.valueOf(n + 1));
ans = ans.multiply(BigInteger.valueOf(n + 2));
ans = ans.divide(BigInteger.valueOf(6));
ans = ans.multiply(ans);
System.out.println(ans);
}
}
}

本文作者:jujimeizuo
本文地址https://blog.jujimeizuo.cn/2020/10/02/2020-nowcoder-guoqing-2-f/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!