タイトル
回N $行列の$ N \逆行列を求めて。答えは、$ 10 $ ^ 9 + 7を法。、出力「いいえソリューション」可逆ない場合。
分析
線形代数の知識、逆行列A、
Aは単位行列になったときだけ行列A、一次変換の右側に追加し、右側は、逆行列Aです。
シンプルな証拠:$ AEの\ RIGHTARROWのE {A}「$
コード
//からhttps://blog.csdn.net/qq_43653202/article/details/99976316
#include <iostreamの> する#include <cstdioを> する#include <cmath> の#define再登録 の#define ILインライン の#defineが長い長いllの 使用 名前空間STDを、 ILのLLリード(){ LL S = 0、F = 0。チャー C = GETCHAR()。 一方、(C < ' 0 ' || C> ' 9 ')、F =(C == ' - ')、C = GETCHAR()。 一方(> = C ' 0 ' && C <= '')S =(S << 3)+(S << 1)+(C ^ ' 0 ')、C = GETCHAR()。 返す fは- ?sの:秒; } のconst int型 N = 405、MOD = 1E9 + 7 。 int型のn; LL [N] [N << 1 ]。 IL LL qpow(LLのX、LLのK){ LL ANS = 1 。 一方、(K){ 場合(K&1)ANS = ANS * X%MOD。 X = X * X%MOD。 K >> = 1 。 } 戻る ANS%のMODを、 } IL ボイドGauss_j(){ ため(再INT I = 1、R、; iが<= N; ++ I){ R = I。 用(RE INT J = + 1 <; J = N ++ j)の 場合([R] [i]は、R = [J] [I])> J。 もし(!R = I)スワップ([I]、[R])。 もし {プット(([I] [I]!)" ノーソリューション"); 返す;} int型 KK = qpow([I] [I]、mod- 2)。// 求逆元 について(RE INT K = 1 ; K <= N; ++ K){ IF(K == I)続行; int型のP A = [K] [I] * KK%MOD; 用(RE INT J = I、Jを<=(N - << 1。); ++ J) A [K] [J] =(([K] [J] -p * A [I] [J])+ MOD%MOD)%MOD; } 用(RE INT J = 1 ; J <=(N - << 1); J ++)A [I] [J] =([I]、[J] *%KK MOD); // 場合は、現在の行を更新ここに置か直接的として、最終的な逆元に再びシーク時間を } ため(RE INT I = 1; ++; iが<= N ){I ため(再INT J = N + 1、J <(N << 1); ++ J)のprintf(" %のLLD " 、[I] [J])。 printf(" %LLDする\ n "、[I] [N << 1 ])。 } } int型のmain(){ N = )(読み取ります。 用(RE INT I = 1 ++; iが<= N I) のために(再INT J = 1 ; J <= N; ++ J) [i] [j]が(読み取り=)、[I] = [iがN +] 1 。 Gauss_j(); リターン 0 ; }