P4783-[模板]矩阵求逆
正题
题目链接:https://www.luogu.com.cn/problem/P4783
题目大意
给出一个矩阵,求它的逆矩阵。
\(1\leq n\leq 400\)
解题思路
记给出矩阵\(P\),记单位矩阵\(E\)。
\]
虽然看上去上面那个式子是废话,但是这是一个提示。
因为\(P\)进行初等变化变为\(E\)的过程中相当于乘上了一个\(P^{-1}\),而\(P^{-1}\times E=P^{-1}\)。所以如果我们拿一个\(E\)和\(P\)做一样的初等变化就变为了\(P^{-1}\)。
写个高斯消元就好了,但是需要注意因为一般的消元会自动省略已经消掉的部分,但是因这里要处理\(P^{-1}\)矩阵所以不能这么做。
时间复杂度\(O(n^3)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=410,P=1e9+7;
ll n,a[N][N],b[N][N];
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
bool work(){
for(ll i=1;i<=n;i++){
for(ll j=i;j<=n;j++)
if(a[j][i]){
if(i!=j)swap(a[j],a[i]),swap(b[j],b[i]);
break;
}
if(!a[i][i])return 1;
ll inv=power(a[i][i],P-2);
for(ll j=1;j<=n;j++)
a[i][j]=a[i][j]*inv%P,b[i][j]=b[i][j]*inv%P;
for(ll j=i+1;j<=n;j++){
ll rate=P-a[j][i];
for(ll k=1;k<=n;k++){
(a[j][k]+=rate*a[i][k]%P)%=P;
(b[j][k]+=rate*b[i][k]%P)%=P;
}
}
}
for(int i=n;i>=1;i--)
for(int j=1;j<i;j++){
for(int k=1;k<=n;k++)
(b[j][k]+=P-a[j][i]*b[i][k]%P)%=P;
a[j][i]=0;
}
return 0;
}
signed main()
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++)
scanf("%lld",&a[i][j]);
b[i][i]=1;
}
if(work())return 0&puts("No Solution");
for(ll i=1;i<=n;i++,putchar('\n'))
for(ll j=1;j<=n;j++)
printf("%lld ",b[i][j]);
return 0;
}
P4783-[模板]矩阵求逆的更多相关文章
- luoguP4783 [模板]矩阵求逆 线性代数
求\(n^2\)的矩阵的逆 翻了翻题解,看到了初等矩阵这个东西,突然想起来在看线代的时候看到过.... 然后又温习了一遍线性代数的知识 不妨设\(PA = E\),其中\(P\)是一堆初等矩阵的积(必 ...
- P4783 【模板】矩阵求逆
原题链接 https://www.luogu.org/problemnew/show/P4783 一道模板题,更重要的省选难度..... 题目要求的是一个n*n的逆矩阵,还要对大数取膜. 普通高中生: ...
- 洛谷 P4783 【模板】矩阵求逆
题目分析 模板题. #include <bits/stdc++.h> using namespace std; typedef long long ll; const int mod=1e ...
- LUOGU P4783 【模板】矩阵求逆(高斯消元)
传送门 解题思路 用高斯消元对矩阵求逆,设\(A*B=C\),\(C\)为单位矩阵,则\(B\)为\(A\)的逆矩阵.做法是把\(B\)先设成单位矩阵,然后对\(A\)做高斯消元的过程,对\(B\)进 ...
- 题解 P4783 【【模板】矩阵求逆】
题目大意 求一个N×N的矩阵的逆矩阵.答案对10^9+7取模.N<=400 前置知识 矩阵的初等变换 矩阵的逆定义为 A*B=E(E为单位矩阵)此时B为A的逆 思路 如果矩阵有逆 那么这个矩阵经 ...
- 洛谷P4783 【模板】矩阵求逆(高斯消元)
题意 题目链接 Sol 首先在原矩阵的右侧放一个单位矩阵 对左侧的矩阵高斯消元 右侧的矩阵即为逆矩阵 // luogu-judger-enable-o2 #include<bits/stdc++ ...
- LG4783 【模板】矩阵求逆
P4783 [模板]矩阵求逆 题目描述 求一个$N\times N$的矩阵的逆矩阵.答案对$10^9+7$取模. 输入输出格式 输入格式: 第一行有一个整数$N$,代表矩阵的大小: 从第$2$行到第$ ...
- matrix矩阵求逆 与解方程模板 留做备用 (有bug,待补充)
// // main.cpp // 矩阵求逆 // // Created by 唐 锐 on 13-6-20. // Copyright (c) 2013年 唐 锐. All rights reser ...
- Luogu4783 【模板】矩阵求逆(高斯消元)
对矩阵进行高斯消元直至消为单位矩阵,并在另一个单位矩阵上对其做同样的操作即可. 模意义下的高斯消元可以直接计算系数来避免整行的辗转相除. 还不知道有什么用. #include<iostream& ...
- OpenCV2邻域和模板操作
在图像处理中,通过当前位置的邻域像素计算新的像素值是很常见的操作.当邻域包含图像的上几行和下几行时,就需要同时扫描图像的若干行,这就是图像的邻域操作了.至于模板操作是实现空间滤波的基础,通常是使用一个 ...
随机推荐
- Future有返回值的线程
//创建一个线程池 ExecutorService pool = Executors.newFixedThreadPool(100); //创建多个有返回值的任务 List<Future> ...
- Specification排序orderby
废话不多说直接贴代码 Specification<Course> sf = new Specification<Course>() { @Override public Pre ...
- .net下Global.asax使用
Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用程序安全性以及其它一些任务.下面让我们详细看 ...
- C# 单元测试,测试资源管理器里面没有需要的单元测试
已经创建了单元测试,却无法运行,更改引用的程序集,将TestPlatform换位QualityTools.UnitTestFramework.具体原因尚未分析,随笔记录.
- 【.Net】深入理解C#的装箱和拆箱
装箱和拆箱是值类型和引用类型之间相互转换是要执行的操作. 1. 装箱在值类型向引用类型转换时发生 2. 拆箱在引用类型向值类型转换时发生 光上述两句话不难理解,但是往深处了解,就需要一些篇幅来解释了 ...
- VS2017 添加预定义宏
project_name[right click] -> Properties -> C/C++ -> Preprocessor -> Preprocessor Definit ...
- Shell 脚本如何输出帮助信息?
作者展示了一个技巧,将帮助信息写在 Bash 脚本脚本的头部,然后只要执行"脚本名 + help",就能输出这段帮助信息 https://samizdat.dev/help-mes ...
- SSL基础知识及Nginx/Tomcat配置SSL
HTTPS 是在 HTTPS 基础之上添加 SSL/TLS 使网络通讯加密,进而确保通信安全.可简记为 HTTPS = HTTP + SSL/TLS 本文档主要讲解常规SSL格式.Nginx 与 To ...
- springMVC学习总结(三) --springMVC重定向
根据springMVC学习总结(一) --springMVC搭建搭建项目 在com.myl.controller包下创建一个java类WebController. 在jsp子文件夹下创建一个视图文件i ...
- 剑指offer计划9(动态规划中等版)---java
1.1.题目1 剑指 Offer 42. 连续子数组的最大和 1.2.解法 得到转移方程后,单次遍历. 当前面的连续子数组的和比较是否大于0,是则加起来, 若小于零,则当前的值就可当子数组的开头. 判 ...