以前只會高斯消元
高斯消元可以o(n^4)解決
但是可以做到o(n^3)
考慮要求
p*a=e
有e*a=a
發現,高斯消元就是不斷進行「交換兩行,某一行乘上k,某一行乘上k加到另一行上去」
這三種變換,都可以通過左乘乙個唯一的矩陣等價得到!(而且手玩發現,如果開始另乙個矩陣是單位矩陣,就是單位矩陣做同樣的變化乘過去就是了)
所以,開始讓p=e
然後a不斷高斯消元向e靠攏,p同時做完全相同的操作
最後a變成e,
那麼p乘a,就是e了。
如果中途存在乙個a[i][i]等於0,那麼意味著無論如何不能削成單位矩陣。一定無解。(因為變換是可逆的,不可能乙個a既能削成單位矩陣又不能)
否則由於可以構造出p,一定有解。
一種映象對映的感覺
#include#define reg register intview code#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
using
namespace
std;
typedef
long
long
ll;template
il void rd(t &x)
template
il void output(t x)
template
il void ot(t x)
template
il void prt(t a,int st,int nd)
namespace
miracle
struct
tr
void swap(int x,int
y)
void mul(int x,int
k)
void mov(int x,int y,int k)
}a,b;
int qm(int x,int
y)
return
ret;
}int
main()
}for(reg i=1;i<=n;++i) b[i][i]=1
;
bool fl=true
;
for(reg i=1;i<=n;++i)}}
if(!a[i][i])
b.mul(i,qm(a[i][i],mod-2));a.mul(i,qm(a[i][i],mod-2
));
for(reg j=i+1;j<=n;++j)
} }
//for(reg i=1;i<=n;++i)cout/
}cout
no solution");
else
}//for(reg k=1;k<=n;++k)cout/
}cout
for(reg i=1;i<=n;++i)
}return0;
}}signed main()
/*author: *miracle*
date: 2019/3/31 10:25:05
*/
伴隨矩陣求逆矩陣
在之前的文章 線性代數之矩陣 中已經介紹了一些關於矩陣的基本概念,本篇文章主要就求解逆矩陣進行進一步總結。我們先看例子來直觀的理解什麼是余子式 minor,後邊將都用英文minor,中文的翻譯較亂 這個例子 我們假設矩陣為a 中我們看到a 1,1 的minor就是將a 1,1 所在的行和列刪除後剩下...
矩陣的求逆
最近做乙個加密演算法遇到需要計算矩陣的逆,閒著無聊,記錄一下,以後免得再麻煩。include include include define max 20 define e 0.000000001 計算矩陣src的模 double calculate a double src max int n fo...
模板 矩陣求逆
求乙個 n times n 的矩陣的逆矩陣。答案對 10 9 7 取模。在原矩陣右邊接乙個單位矩陣,然後把原矩陣通過初等變換消成單位矩陣,右邊的單位矩陣做同樣的變換,就成了逆矩陣。什麼,為什麼?難得你不覺得這個想起來非常的正確麼 code luogu judger enable o2 include...