资源限制
内存限制:64.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
给出一个n阶行列式(1<=n<=9),求出它的值。
输入格式
第一行给出两个正整数n,p;
接下来n行,每行n个数,表示行列式,数据保证行列式中每个数绝对值不超过2*10^9。
输出格式
一个数表示行列式的值,答案对p取余(余数需要是非负数)。
样例输入
2 2
5 -4
2 -1
样例输出
1
部分数据范围
对于20%的数据n<=2
对于40%的数据n<=3
对于100%的数据n<=9,p<=40000。
解法:本来以为要靠后面的提示才能AC的,甚至我刚开始还考虑了行列式计算出负数取余可能会出问题(python负数的取余操作会向下进一,例:-123%10 = -123 - 10 * (-123 // 10) = -123 - 10 * (-13) = 7,但是不知道为什么好像这题并不用注意这个),但蓝桥杯暴力杯的名称属实名不虚传,直接暴力递归就完事了。
本题使用行列式的解法为代数余子式法,不懂的话自行学习线性代数(我数学不好就不教了)
import copy
# 行列式计算:使用递归的方法对低阶行列式进行计算
def cal_det(l):
result = 0
if len(l) == 1:
return l[0][0]
if len(l) == 2:
return l[0][0] * l[1][1] - l[0][1] * l[1][0]
s = l.pop(0)
# 代数余子式计算方法
# 本题全部以第一行展开:det(x) = Ai1*ai1 + ... + Ain*ain
# Aij = (-1) ** (i + j) * Mij
# Mij指划去了第i行和第j列的行列式
for i in range(len(s)):
l1 = copy.deepcopy(l) # 必须使用深拷贝,浅拷贝只能使第一层正常计算
for t in range(len(l1)):
del l1[t][i]
result += (s[i] * ((-1) ** (i + 2)) * cal_det(l1)) % p
return result % p
n, p = list(map(int, input().split()))
lis = []
for i in range(n):
lis.append(list(map(int, input().split())))
print(cal_det(lis) % p)