本题可以直接利用贡献法求解。一个n * n的矩阵可以分解为3个部分,以如下 4 * 4的矩阵为例:
x y y x
y z z y
y z z y
x y y x
- x代表了四个角,每一个x的贡献为2次。
- y是除了四个角的最外面元素,每一个y的贡献为3次。
- 其余的就是z,贡献为4次。
题目要求最大的取值,那么我们不妨贪心的让x最小,y次之,z最大,这样就被分解为了3个等差数列,求解即可。
import sys
from math import inf
# 输入加速
input = sys.stdin.readline
"""
n = 2
1 2
3 4
n = 3
1 5 2
6 9 8
3 7 4
x y y x
y z z y
y z z y
x y y x
分为3类
四个角肯定是最小的,每一个贡献两次
除了四个角的边次小,每一个贡献3次
其他的最大,贡献4次
"""
if __name__ == '__main__':
n = int(input())
MOD = 10 ** 9 + 7
res = 0
#从l到r的等差数列求和
def cal(l: int,r: int) -> int:
if l > r:
return 0
return (l + r) * (r - l + 1) // 2
# x段的计算
res += cal(1, 4) * 2 % MOD
res %= MOD
# y段的计算
y = n * n - (n - 2) * (n - 2) - 4
res += cal(4 + 1,4 + y) * 3 % MOD
res %= MOD
# z段的计算
res += cal(n * n - (n - 2) * (n - 2) + 1, n * n) * 4 % MOD
res %= MOD
print(res)