2021 ICPC济南 J Determinant

题意就是给定一个矩阵,然后给出他的行列式的绝对值,这个值是精确的,然后让我们判断行列式的正负。

思路来源:一个Acmer

首先做这个题要明白一个性质才可以做,一个数和它的相反数对一个奇数的取模一定不同,因此对于这个题而言,我们只需要选一个模数然后求行列式的值然后与给定的精确值取模后的结果相比较即可,也就是说如果我们算出来的值与给定值相同,那么说明他俩同号,否则说明异号,然后来证明这个性质:

任意一对非0的相反数,有x1x2(modp)p为奇数,且x1modp0x2modp0

x1+x2=0=>(x1+x2)modp=0=>(x1modp+x2modp)modp=0(1)

假设x1x2(modp),那么令t1=x1modpt2=x2modp,那么则有t1=t2,并且t1<pt2<p
那么得知:

  • t1+t2为偶数
  • t1+t2<2×p(2)
    而把ti(i=1,2)代入上面式子(1)(t1+t2)modp==0,那么说明(t1+t2)=kp,由(2)得知0<k<2,那么k=1,即(t1+t2)=p,又因为p是奇数,而(t1+t2)是偶数,所以矛盾。

规则

  • 矩阵转置,行列式不变
  • 矩阵行(列)交换,行列式取反
  • 矩阵行(列)相加减,行列式不变
  • 矩阵行(列)所有元素同时乘以一个数,行列式等比例变大
// Problem: P7112 【模板】行列式求值
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P7112
// Memory Limit: 64 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 110, Mod = 1e9 + 7;
int a[N][N];
int n;

LL qmi(LL a, LL b, LL Mod) {
	LL res = 1;
	while (b) {
		if (b & 1) res = res * a % Mod;
		b >>= 1;
		a = a * a % Mod;
	}
	return res % Mod;
}

LL Guass() {
	LL det = 1;
	for (int i = 1; i <= n; i++) { //枚举列
		int k = i;
		for (int j = i + 1; j <= n; j++) //把最大的一行放到最上边
			if (abs(a[j][i]) > abs(a[k][i])) k = j;
		if (abs(a[k][i]) == 0) { //如果斜线有0,结果就是0
			det = 0;
			break;
		}
		swap(a[i], a[k]); //把最大的一行放到最上边
		if (i != k) det = -det; //如果有行交换,行列式取反
		det = (1ll * det * a[i][i] % Mod + Mod) % Mod; //结果贡献
		for (int j = i + 1; j <= n; j++) {
			a[i][j]	= 1ll * a[i][j]	* qmi(a[i][i], Mod - 2, Mod) % Mod; //将每行的首位数变为1,这里就是取模
		}
		for (int j = 1; j <= n; j++) {
			if (j != i && a[j][i]) {
				for (int l = i + 1; l <= n; l++) {
					a[j][l] = (a[j][l] - 1ll * a[i][l] * a[j][i] % Mod + Mod) % Mod; 
				}
			}
		}
	}
	
	return det;
}

int main() {
	int t;
	cin >> t;
	while (t--) {
		cin >> n;
		string s;
		cin >> s;
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				cin >> a[i][j];
			}
		}	
		LL res = s[0] - '0';
		for (int i = 1; i < s.size(); i++) {
			res = (res * 10 % Mod + s[i] - '0') % Mod;
		}
		puts(res == Guass() ? "+" : "-");
	}

	return 0;
}
posted @   Xxaj5  阅读(71)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示