蓝桥杯 算法训练 ALGO-932低阶行列式计算 python解法

资源限制

内存限制: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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值