SPOJ - DETER3:Find The Determinant III (求解行列式)

Find The Determinant III

题目链接:https://vjudge.net/problem/SPOJ-DETER3

Description:

Given a NxN matrix A, find the Determinant of A % P.

Input:

Multiple test cases (the size of input file is about 3MB, all numbers in each matrix are generated randomly).

The first line of every test case contains two integers , representing N (0 < N < 201) and P (0 < P < 1,000,000,001). The following N lines each contain N integers, the j-th number in i-th line represents A[i][j] (- 1,000,000,001 < A[i][j] < 1,000,000,001).

Output:

For each test case, print a single line contains the answer.

Sample Input:

1 10
-528261590
2 2
595698392 -398355861
603279964 -232703411
3 4
-840419217 -895520213 -303215897
537496093 181887787 -957451145
-305184545 584351123 -257712188

Sample Output:

0
0
2

题意:

求解行列式模上p的值。

题解:

主要了解下行列式的性质就行了:https://www.cnblogs.com/GerynOhenz/p/4450417.html

之后就类似于高斯消元去计算,代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 205;
int n;
ll p ;
ll b[N][N];
ll Det(int n){
    int i,j,k;
    ll ret = 1;
    for(i=1;i<=n;i++){
        for(j = i+1;j <= n;j++){
            while(b[j][i]){
                ll tmp=b[i][i]/b[j][i];
                for(k = i;k <= n;k++)
                    b[i][k] =((b[i][k] - tmp*b[j][k])%p+p)%p;
                swap(b[i],b[j]);
                ret = -ret;
            }
        }
        if(!b[i][i]) return 0;
        ret = ret*b[i][i]%p;
    }
    if(ret < 0) ret = ret+p;
    return ret;
}
int main(){
    while(scanf("%d%lld",&n,&p)!=EOF){
        memset(b,0,sizeof(b));
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cin>>b[i][j];
            }
        }
        cout<<Det(n)<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/heyuhhh/p/10392732.html

时间: 2024-10-10 10:00:12

SPOJ - DETER3:Find The Determinant III (求解行列式)的相关文章

SPOJ - Find The Determinant III 计算矩阵的行列式答案 + 辗转相除法思想

SPOJ -Find The Determinant III 参考:https://blog.csdn.net/zhoufenqin/article/details/7779707 参考中还有几个关于行列式的性质. 题意: 计算矩阵的行列式答案 思路: 计算行列式的基本方法就是把矩阵化成上三角或下三角,然后观察对角线的元素,如果其中有一个元素为0则答案为0,否则行列式的值就是对角线上各个元素的乘积. #include <algorithm> #include <iterator>

bzoj 2107: Spoj2832 Find The Determinant III 辗转相除法

2107: Spoj2832 Find The Determinant III Time Limit: 1 Sec  Memory Limit: 259 MBSubmit: 154  Solved: 46[Submit][Status][Discuss] Description Problem code: DETER3 Given a NxN matrix A, find the Determinant of A % P. 给出一个尺寸为N×N的整数方阵A(N≤200),要求求出|A|%P的值(

行列式 &amp; 高斯消元求解行列式

行列式 \[D = \left| \begin{array}{c} a_{11} & a_{12} & a_{13} \a_{21} & a_{22} & a_{23} \a_{31} & a_{32} & a_{33} \\end{array} \right|\] 上图是一个三阶行列式,行列式是形如上图的一个东西,简记为: \(det(a_{ij})\), 其中\(a_{ij}\)是行列式的第\(ij\)元. 一个n阶行列式的值为: \[\sum (-1)

POJ - 2406 ~SPOJ - REPEATS~POJ - 3693 后缀数组求解重复字串问题

POJ - 2406 题意: 给出一个字符串,要把它写成(x)n的形式,问n的最大值. 这题是求整个串的重复次数,不是重复最多次数的字串 这题很容易想到用KMP求最小循环节就没了,但是后缀数组也能写 后缀数组写法放在后面那一题,SPOJ - REPEATS是求子串类型,KMP就不好处理了 这里放下处理KMP的AC代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <c

kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一个环,如果还要维护处树的特点 那么就要在这个环上删去一条边,这样他还是树,删掉的边显然是这条链上权值最大边更可能形成次小生成树.那么就有2中方法可以做. 第一种PRIM在prim时候直接可以做出这个从I到J的链上权值最大的值MAX[i][j]; 同时可以用kruskal同样方式标记树边,然后DFS跑

利用克拉莫法则求解n元线性方程组

接上一篇随笔,利用克拉莫法则求解n元线性方程组. 代码: 1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 void appDescribe(); //程序说明 5 double valDet( double* detPtr, int rank); //求解行列式 6 class LinearEquations 7 { 8 public: 9 LinearEquations(); //构造方程组 10

numpy奇异值分解,广义逆矩阵与行列式

SVD 是一种因子分解运算, 将一个矩阵分解为3个矩阵的乘积 其中, 奇异值矩阵是对角线矩阵 Key_Function np.linalg.svd函数, 可以对矩阵进行奇异值分解. U: 正交矩阵 sigma: 表示奇异值矩阵对角线的数组, 其他非对角线元素均为0 V: 正交矩阵 np.diag函数, 得出完整的奇异值矩阵 Code import numpy as np A = np.mat("4 11 14; 8 7 -2") print(A) ''' [[ 4 11 14] [ 8

Matrix_tree Theorem 学习笔记

Matrix_tree Theorem: 给定一个无向图, 定义矩阵A A[i][j] = - (<i, j>之间的边数) A[i][i] = 点i的度数 其生成树的个数等于 A的任意n - 1阶主子式的值. 关于定理的相关证明 可以看这篇文章, 讲得非常详细, 耐心看就能看懂: 关于求行列式, 可以用高斯消元. 如果是模域下求行列式, 可以用欧几里得算法. 具体实现看这篇文章 模域下求行列式 模板题:SPOJ DETER3 代码: 1 #include <cstdio> 2 #i

three.js 源码注释(九)Math/Matrix4.js

商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化.GOLANG.Html5.WEBGL.THREE.JS,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 今天把math库中最大的对象Matrix4注释完了,发现之前好多的注释理解的不太正确,还有好多的注释因为马虎,好多小错误.能改的都在github上更新了,不过大概意思,