题目大意

求一个N×N的矩阵的逆矩阵。答案对10^9+7取模。N<=400


前置知识

矩阵的初等变换

矩阵的逆定义为 A*B=E(E为单位矩阵)此时B为A的逆


思路

如果矩阵有逆

那么这个矩阵经过一系列初等变化之后可以变为E

设一系列初等变化分别为p1,p2,p3...px

显然可得A*p1*p2*p3*...*px=E

所以B=p1*p2*p3*...*px

这样的话就很好做了

我们利用高斯消元来让A逐渐变为单位矩阵

设B初始为E

B也跟着A同步变换

那么到A变为单位矩阵时 B也就是p1*p2*p3*...*px的值了

矩阵无逆的情况显然是高斯消元无法再消(a[1][i]-a[n][i]都为0时)特判输出就行哩


代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define C getchar()-48
inline ll read()
{
ll s=,r=;
char c=C;
for(;c<||c>;c=C) if(c==-) r=-;
for(;c>=&&c<=;c=C) s=(s<<)+(s<<)+c;
return s*r;
}
const ll N=,p=1e9+;
ll n;
struct xin{
ll a[N][N];
//inline int* operator [](int x){return a[x];} // b的话直接调用b[][]
inline void swap(int x,int y){for(int i=;i<=n;i++) swap(a[x][i],a[y][i]);}
inline void mul(int x,int k){for(int i=;i<=n;i++) a[x][i]=(a[x][i]*k%p+p)%p;}//a[x]=k*a[y];
inline void add(int x,int y,int k){for(int i=;i<=n;i++) a[x][i]=((a[x][i]+a[y][i]*k)%p+p)%p;}// a[x]加k*a[y]
inline void prt()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++) printf("%lld ",a[i][j]);
printf("\n");
}
}
}a,b;
inline ll ksm(ll a,ll b)
{
ll ans=;
while(b)
{
if(b&) ans=(ans*a)%p;
a=(a*a)%p;
b>>=;
}
return ans;
}
void gaosi()
{
for(int i=;i<=n;i++)
{
if(!a.a[i][i]) for(int j=i+;j<=n;j++) if(a.a[j][i])
{
a.swap(i,j);b.swap(i,j);
break;
}
if(!a.a[i][i]){printf("No Solution\n");exit();}
b.mul(i,ksm(a.a[i][i],p-));a.mul(i,ksm(a.a[i][i],p-));//把所有项除a[i][i] 变成a[i][i]变成1
for(int j=;j<=n;j++)
{
if(i==j) continue;
b.add(j,i,-a.a[j][i]);a.add(j,i,-a.a[j][i]);//消去 b要放前面因为a放前面会被修改
}
}
}
int main()
{
n=read();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
a.a[i][j]=read();
for(int i=;i<=n;i++) b.a[i][i]=;
gaosi();
b.prt();
return ;
}

题解 P4783 【【模板】矩阵求逆】的更多相关文章

  1. luoguP4783 [模板]矩阵求逆 线性代数

    求\(n^2\)的矩阵的逆 翻了翻题解,看到了初等矩阵这个东西,突然想起来在看线代的时候看到过.... 然后又温习了一遍线性代数的知识 不妨设\(PA = E\),其中\(P\)是一堆初等矩阵的积(必 ...

  2. 字符串 kmp算法 codeforce 625B 题解(模板)

    题解:kmp算法 代码: #include <iostream>#include <algorithm>#include <cstring>#include < ...

  3. CCF-CSP题解 201509-3 模板生成系统

    简单的替换一下字符串. 注意数组开大点. #include<bits/stdc++.h> const int maxm = 100; const int maxn = 100; using ...

  4. 【刷题】洛谷 P3804 【模板】后缀自动机

    题目描述 给定一个只包含小写字母的字符串 \(S\) , 请你求出 \(S\) 的所有出现次数不为 \(1\) 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字 ...

  5. [BZOJ3224]Tyvj 1728 普通平衡树

    [BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...

  6. [UOJ#34]多项式乘法

    [UOJ#34]多项式乘法 试题描述 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入 第一行两个整数 n 和 m,分别表示两个多项式的次数. 第二行 n+1 个整数,分别表示第一个多 ...

  7. 1711 Number Sequence(kmp)

    Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], .... ...

  8. 【LCT】BZOJ2049 [SDOI2008]Cave 洞穴勘测

    2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 10059  Solved: 4863[Submit ...

  9. 【网络流】POJ1273 Drainage Ditches

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 78671   Accepted: 3068 ...

随机推荐

  1. keepalived介绍

    keepalived介绍 Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat.corosync.pacemaker.但是它 ...

  2. Android 沉浸式状态栏完美解决方案

    现在搜索Android 沉浸式状态栏,真的是一堆一堆,写的特别多,但是真正用的舒服的真没有,在这里自己整理一下开发记录 注意,在使用这个步骤过程之前,请把之前设置的代码注释一下 把布局带有androi ...

  3. Python-函数小结

    原文出处,如有侵权,请联系删除. 用户自定义.py文件 如果你已经把my_abs()的函数定义保存为abstest.py文件了,那么,可以在该文件的当前目录下启动Python解释器,用from abs ...

  4. 一些android开发实用性网站记录

    android开发一些有用的网站有很多,可以方便我们开发,记录一下哈. 1.Android源代码在线阅读:https://www.androidos.net.cn/sourcecode 2.在线Jso ...

  5. DVWA 黑客攻防演练(十)反射型 XSS 攻击 Reflected Cross Site Scripting

    XSS (Cross-site scripting) 攻击,为和 CSS 有所区分,所以叫 XSS.又是一种防不胜防的攻击,应该算是一种 "HTML注入攻击",原本开发者想的是显示 ...

  6. LeetCode的刷题利器(伪装到老板都无法diss你没有工作)

    在工程效率大行其道的今天,如果不会写点代码以后也不容易在测试圈混下去.今天给大家推荐一个LeetCode的刷题利器,可以伪装到连你老板在这里走过去都无法确认你是在干活呢,还是在干活呢. LeetCod ...

  7. Kafka单节点及集群配置安装

    一.单节点 1.上传Kafka安装包到Linux系统[当前为Centos7]. 2.解压,配置conf/server.property. 2.1配置broker.id 2.2配置log.dirs 2. ...

  8. Docker-镜像源加速配置

    Docker官网镜像服务在境外,拉取速度很比较慢,所以我们安装完Docker后一般会切换镜像源,将镜像源切换到国内以此达到加速的目的. 国内比较常用的Docker Hub镜像服务:1.阿里云2.Dao ...

  9. ChromeDriver截图

    一.NuGet安装Selenium.Chrome.WebDriver和Selenium.WebDriver 二.将packages\Selenium.Chrome.WebDriver.2.45\dri ...

  10. 既然CPU一次只能执行一个线程,那多线程存在的意义是什么?

    今天看到了一篇文章,终于解除了一直的疑惑.         原文链接:https://www.cnblogs.com/qingbafengliuxia/p/10171638.html CPU的时间是按 ...