Обратная матрица [шаблон]

титульный

P4783

Ищу $ N \ обратную матрицу раз N $ матрицы. Ответ по модулю $ 10 $ ^ 9 + 7. Если не обратимы, выход «No Solution».

анализ

Знание линейной алгебры, обратная матрица А,

Просто добавить справа от матрицы А, первичной трансформация, когда становится единичной матрицей, правый обратной матрица А.

Простое доказательство: $ AE \ СтрелкаВправо E {A} $

код

// из https://blog.csdn.net/qq_43653202/article/details/99976316

#include <iostream> 
#include <cstdio> 
#include <CMATH>
 #define повторно зарегистрировать
 #define IL встраивать
 #define буду долго долго
 с помощью  пространства имен STD; 

илы будут следующим образом () { 
    LL с = 0 , е = 0 ; символ с = GetChar ();
    в то время как (с < ' 0 ' || с> ' 9 ' ) F = (с == ' - ' ), с = GetChar ();
    в то время как (с> = ' 0 ' && C <= '' ) = S (s << 3 ) + (с << 1 ) + (с ^ ' 0 ' ), с = GetChar ();
    вернуться п - s: s; 
} 

Const  INT N = 405 , мод = 1e9 + 7 ;
ИНТ п; 
LL A [N] , [N << 1 ]; 
IL LL qpow (LL х, Л.Л. к) { 
    LL ANS = 1 ;
    в то время как (к) {
         если (к & 1 ) ANS = ANS * х% по модулю; 
        х = х * х% по модулю; 
        K >> = 1 ; 
    }
    вернуться анс% мода; 
} 

Ил пустота Gauss_j () {
     для (ре Int I = 1 , г; г <= п; ++ я) { 
        г = я;
        для (ре INT J = I + 1 , J <= п; ++ к)
             , если (а [J] [I]> а [г] [г]) г = J;
        если (! г = я) подкачки (а [I], а [г]);
        если {путы ((а [I] [I]!) " No Solution " ); возвращать ;} 

        INT кк = qpow (а [I] [I], mod - 2 ); // 求逆元
        для(Re INT К = 1. , К <= п; ++ К) {
             ЕСЛИ (К == I) , Продолжить ;
             INT P A = [K] [I] * К.К.% MOD;
             для (Re Int J = I; J <= (п - << 1. ); ++ , J) , 
                А [К] [Дж] = ((А [К] [Дж] -п * A [I] , [Дж]) + MOD% MOD)% MOD; 
        } 

        для (Re INT J = 1. , J <= (п - << 1. ); j ++) А [I] , [Дж] = (A [I] , [Дж] *% КК МО);
         // обновить текущую строку , если искать снова на окончательном обратном элементе, как прямая помещено здесь 
    } 

    для (Re INT I = . 1; г <= п; ++ я) {
         для (ре INT J = п + 1 , J <(п << 1 ); ++ J) Е ( " % LLD " , а [I] [J]); 
        Е ( " % LLD \ п " , а [я] [п << 1 ]); 
    } 
} 
Int основных () { 
    п = следующим образом ();
    для (ре Int я = 1 ; г <= п; ++ я)
         для (ре INT J = 1 , J <= п; ++ к) 
            а [I] [J] = следующим образом (), а [я] [я + N] = 1 ;

    Gauss_j (); 
    вернуться  0 ; 
}

 

рекомендация

отwww.cnblogs.com/lfri/p/11618589.html