题解 P4783 【【模板】矩阵求逆】
题目大意
求一个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 【【模板】矩阵求逆】的更多相关文章
- luoguP4783 [模板]矩阵求逆 线性代数
求\(n^2\)的矩阵的逆 翻了翻题解,看到了初等矩阵这个东西,突然想起来在看线代的时候看到过.... 然后又温习了一遍线性代数的知识 不妨设\(PA = E\),其中\(P\)是一堆初等矩阵的积(必 ...
- 字符串 kmp算法 codeforce 625B 题解(模板)
题解:kmp算法 代码: #include <iostream>#include <algorithm>#include <cstring>#include < ...
- CCF-CSP题解 201509-3 模板生成系统
简单的替换一下字符串. 注意数组开大点. #include<bits/stdc++.h> const int maxm = 100; const int maxn = 100; using ...
- 【刷题】洛谷 P3804 【模板】后缀自动机
题目描述 给定一个只包含小写字母的字符串 \(S\) , 请你求出 \(S\) 的所有出现次数不为 \(1\) 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字 ...
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- [UOJ#34]多项式乘法
[UOJ#34]多项式乘法 试题描述 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入 第一行两个整数 n 和 m,分别表示两个多项式的次数. 第二行 n+1 个整数,分别表示第一个多 ...
- 1711 Number Sequence(kmp)
Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], .... ...
- 【LCT】BZOJ2049 [SDOI2008]Cave 洞穴勘测
2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 10059 Solved: 4863[Submit ...
- 【网络流】POJ1273 Drainage Ditches
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 78671 Accepted: 3068 ...
随机推荐
- Java内存区域和内存溢出异常
前言 对于java程序员来说,在虚拟机自动内存管理的机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出的问题,由虚拟机管理内存,这一切看起来都很 ...
- 006. SSO 单点登录(同域SSO/跨域SSO)
SSO 单点登录:一次登录,处处登录. 只需在一个登录认证服务下进行登录后,就可访问所有相互信任的应用 同域 SSO 1. session-cookie机制:服务端通过cookie认证客户端. 用户第 ...
- javascript原型与原型链,prototype、__proto__、constructor
javascript通过构造函数(constructor)和原型链来(prototype chain)实现其他面向对象语言的类概念.ES6语法中引入了“类”(class)的概念,但只是一个语法糖,只是 ...
- 使用 Scrapy 爬取股票代码
个人博客: https://mypython.me 源码地址: https://github.com/geeeeeeeek/scrapy_stock 抓取工具:scrapy scrapy 介绍 Scr ...
- Input 标签 安卓 与 IOS 出现圆角 显示
Input 标签 input[type="submit"],input[type="reset"],input[type="button"] ...
- 一起学Android之Layout
本文简述在Android开发中布局的简单应用,属于基础知识,仅供学习分享使用. 概述 在Android UI开发中,布局类型主要有两种:LinearLayout(线性布局)和RelativeLayou ...
- python中json文件处理涉及的四个函数json.dumps()和json.loads()、json.dump()和json.load()的区分
一.概念理解 1.json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串) (1)json.dumps()函数是将一个Python数据类型列表进行js ...
- C#语言中的修饰符
public:公有访问.不受任何限制. private:私有访问.只限于本类成员访问,子类和实例都不能访问. protected:保护访问.只限于本类和子类访问,实例不能访问. internal:内部 ...
- win10怎么进入和退出安全模式?
在Win10系统里同时按下”Win+R“组合按键,在打开的运行对话框里输入命令:msconfig,然后点击确定,如下图所示. 点击打开系统配置窗口,选择引导选项卡,如下图所示. 在引导选项卡窗口下,将 ...
- python☞自动发送邮件
一.SMTP 协议 SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式 二.smtplib ...