逆行列[テンプレート]

タイトル

P4783

回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 ; 
}

 

おすすめ

転載: www.cnblogs.com/lfri/p/11618589.html