题目大意

求一个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. 调用链监控 CAT 之 入门

    简介 CAT 是一个实时和接近全量的监控系统,它侧重于对Java应用的监控,基本接入了美团上海所有核心应用.目前在中间件(MVC.RPC.数据库.缓存等)框架中得到广泛应用,为美团各业务线提供系统的性 ...

  2. js 更改对象属性名

    来自:https://segmentfault.com/q/1010000011923504 侵删 [ { "Id":"3972679ef2c04151972b376dd ...

  3. 亿级流量场景下,大型架构设计实现【全文检索高级搜索---ElasticSearch篇】-- 中

    1.Elasticsearch的基础分布式架构: 1.Elasticsearch对复杂分布式机制的透明隐藏特性2.Elasticsearch的垂直扩容与水平扩容3.增减或减少节点时的数据rebalan ...

  4. linux下mysql配置文件位置

    在/usr/share/mysql/ 中找到my.cnf的配置文件,拷贝其中的my-huge.cnf 到 /etc/ 并命名为my.cnf

  5. SQL Server数据库————增删改查

    --增删改查--增 insert into 表名(列名) value(值列表) --删 delect from 表名 where 条件 --改 update 表名 set 列名=值1,列名2=值2 w ...

  6. git 同步远程分支

    1. 同步远程分支到本地 git fetch 2. 查看本地分支 git branch *dev //当前分支 master test 3.切换分支 git checkout master // 切换 ...

  7. 数据库升级到mysql5.7出现的1067 - Invalid default value for '字段名' (docker版)

    docker run -d --name xxx mysql:5.7 docker container cp xxx:/etc/mysql/mysql.conf.d .   // 取出mysql中的配 ...

  8. An internal error occurred during: Initializing Java Tooling.

    详细错误信息: An internal error occurred during: "Initializing Java Tooling". java.lang.NullPoin ...

  9. Java BigDecimal类型的 加减乘除运算

    原文: https://blog.csdn.net/xuwei_net/article/details/81253471 加法:add 减法:subtract 乘法:multiply 除法:divid ...

  10. linux 基本命令2

    linux没有磁盘的概念,这一点不同于windows,Linux所有的文件系统采用树的结构完成(核心本质)树自然有根节点 也就是linux存在一个根目录,用/表示ls 表示查看命令 我们使用 ls / ...