(模板)求逆矩阵luoguP4783
2024-09-02 01:04:50
题目链接:https://www.luogu.org/problem/P4783
题意:求矩阵的逆。
思路:高斯消元法求矩阵的逆,n为400,卡常,我是开了O2优化才AC的。。
AC代码:
#include<cstdio>
#include<cctype>
#include<algorithm>
#define R register int
using namespace std; const int maxn=;
const int MOD=1e9+;
int n; struct Matrix{
int m[maxn][maxn];
void SWAP(int x,int y){ //交换两行
for(R i=;i<=n;++i)
swap(m[x][i],m[y][i]);
}
void MUL(int x,int k){ //对一行乘上k
for(R i=;i<=n;++i)
m[x][i]=(1LL*m[x][i]*k%MOD+MOD)%MOD;
}
void MULADD(int x,int y,int k){ //将第y行乘上k加到第x行上去
for(R i=;i<=n;++i)
m[x][i]=((m[x][i]+1LL*m[y][i]*k%MOD)%MOD+MOD)%MOD;
}
}A,B; int qpow(int a,int b){ //求逆元
int ret=;
while(b){
if(b&) ret=1LL*ret*a%MOD;
a=1LL*a*a%MOD;
b>>=;
}
return ret;
} void Invmatrix(){
for(R i=;i<=n;++i){
if(!A.m[i][i]){
for(R j=i+;j<=n;++j)
if(A.m[j][i]){
B.SWAP(i,j);
A.SWAP(i,j);
break;
}
}
if(!A.m[i][i]){ //没有逆矩阵
puts("No Solution");
return;
}
int tmp=qpow(A.m[i][i],MOD-);
B.MUL(i,tmp);
A.MUL(i,tmp); //系数化为1
for(R j=i+;j<=n;++j){ //消元
tmp=-A.m[j][i];
B.MULADD(j,i,tmp);
A.MULADD(j,i,tmp);
}
}
for(R i=n-;i>=;--i) //回带
for(R j=i+;j<=n;++j){
int tmp=-A.m[i][j];
B.MULADD(i,j,tmp);
A.MULADD(i,j,tmp);
}
for(R i=;i<=n;++i){
for(R j=;j<=n;++j){
printf("%d",B.m[i][j]);
if(j!=n) printf(" ");
}
printf("\n");
}
} int main(){
scanf("%d",&n);
for(R i=;i<=n;++i)
for(R j=;j<=n;++j)
scanf("%d",&A.m[i][j]);
for(R i=;i<=n;++i){
for(R j=;j<=n;++j)
B.m[i][j]=;
B.m[i][i]=;
}
Invmatrix();
return ;
}
最新文章
- Js异步上传加进度条
- MySQL Cluster搭建与测试
- 使用 {$INCLUDE} 或 {$I} 指令管理和调用自定义函数
- JS中new都是干了些什么事情
- 十大关系数据库SQL注入工具一览
- Access-Control-Allow-Origin: Dealing with CORS Errors in Angular
- SGU 180 Inversions
- SlidingMenu实现app侧滑功能
- Java通过代理类实现数据库DAO操作
- WTL的核心机制
- WITH+HInt MATERIALIZE 不见得有效
- f.lux——自动调整屏幕色温减少眼睛疲劳,长时间玩电脑必备!
- kernel笔记——内核编译与进程管理
- python学习笔记——(一)基础设置
- R语言-增加图例
- THE OVERARCHING PROCESS OF TEST DESIGN
- Cross-site request forgery 跨站请求伪造
- linux生成SSH key
- 详解Tomcat配置及使用
- windows的类似shell 命令操作