Xiangtan Invitation Contest 2017 - Problem A. Determinant CCPC2017湘潭A 高斯消元

0.png

題目大概意思是給一個 [n - 1] * [n] 的矩陣, 輸出一行 n 個數(shù)分別為原矩陣去掉第 i 行之后的子矩陣的 det.
如果每次去掉一列再高斯消元求子矩陣的 det 時間復雜的會到 O(n ^ 4)撑刺,生成 n 個子矩陣每個子矩陣一次O(n ^ 3) 的高斯消元, 顯然會TLE.
可以將原[n - 1] * [n] 的矩陣加一行補完成一個[n] * [n] 的方陣, 再通過求方陣的逆矩陣得到方陣的伴隨矩陣得到結果, 這樣就是 O(n ^ 3) 的

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int MAXN = 201;
const int P = 1e9 + 7;

long long Ori[MAXN][MAXN], Ret[MAXN][MAXN], M[MAXN][MAXN];

long long FastPowMod(long long x, long long p, long long MOD){  // 快速冪取模
    long long res = 1;
    while(p){
        if(p & 1) res = res * x % MOD;
        x = x * x % MOD;
        p >>= 1;
    }
    return res;
}

void GetInverseMatrix(long long Ori[MAXN][MAXN], long long E[MAXN][MAXN], int n){
    // 通過初等行變換求方陣 Ori 的 det(Ori) * Ori ^ -1
    long long M[MAXN][MAXN], det = 1;
    memset(E, 0, n * n * sizeof(long long));  
    // E 是 n 階單位矩陣
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++) M[i][j] = ((Ori[i][j] % P) + P) % P, E[i][j] = 0;
        E[i][i] = 1;
    }
    for(int i = 1; i <= n; i++){
        int row = i;
        for(int j = i; j <= n; j++) if(M[j][i]){row = j;break;}
        // for(int j = i; j <= n; j++) if(M[j][i]) row = j; 本來是這樣但是想不通為什么. 這里找 row 是防止 M[i][i] 為 0
        if(row != i){
            det *= -1;
            swap(M[i], M[row]);
            swap(E[i], E[row]);
        }
        det = M[i][i] * det % P;
        long long inv = FastPowMod(M[i][i], P - 2, P);
        for(int j = 1; j <= n; j++){
            M[i][j] = inv * M[i][j] % P;
            E[i][j] = inv * E[i][j] % P;
        }
        // 費馬小定理, 將 M[i][i] 化為 1
        for(int j = 1; j <= n; j++){
            if(j == i) continue;
            long long temp = M[j][i];
            for(int k = 1; k <= n; k++){
                M[j][k] = (M[j][k] - M[i][k] * temp % P + P) % P;
                E[j][k] = (E[j][k] - E[i][k] * temp % P + P) % P;
            }
        }
    }
    // 以上為高斯消元求 det(Ori) 和 Ori 的逆部分, 因為是通過對 M|E 進行初等行變換來求 Ori的逆所以很多循環(huán)是 1 到 n 的
    det = (det + P) % P;
    for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) E[i][j] = det * E[i][j] % P;
    // 計算 det(Ori) 乘 Ori 的逆矩陣
}

int main()
{
    int n;

    while(scanf("%d", &n) != EOF){
        for(int i = 1; i <= n - 1; i++){
            for(int j = 1; j <= n; j++){
                scanf("%I64d", &Ori[i][j]);
            }
        }
        for(int j = 1; j <= n; j++) Ori[n][j] = 1;
        GetInverseMatrix(Ori, Ret, n);
        for(int i = 1; i <= n; i++) printf("%I64d%c", ((i + n) & 1 ? (P - Ret[i][n]) % P : Ret[i][n]), " \n"[i == n]);
        // 因為伴隨矩陣里面是代數(shù)余子式而且是按轉(zhuǎn)置的方式放置, 所以是第 n 列的值, 而且對于 (i + n) 為奇數(shù)的情況要取相反數(shù).
    }
    return 0;
}

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末郭计,一起剝皮案震驚了整個濱河市辨图,隨后出現(xiàn)的幾起案子帘睦,更是在濱河造成了極大的恐慌,老刑警劉巖匆篓,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暂吉,死亡現(xiàn)場離奇詭異胖秒,居然都是意外死亡,警方通過查閱死者的電腦和手機慕的,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門阎肝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肮街,你說我怎么就攤上這事风题。” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵沛硅,是天一觀的道長眼刃。 經(jīng)常有香客問我,道長摇肌,這世上最難降的妖魔是什么擂红? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮围小,結果婚禮上昵骤,老公的妹妹穿的比我還像新娘。我一直安慰自己肯适,他們只是感情好变秦,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著框舔,像睡著了一般蹦玫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雨饺,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天钳垮,我揣著相機與錄音惑淳,去河邊找鬼额港。 笑死,一個胖子當著我的面吹牛歧焦,可吹牛的內(nèi)容都是我干的移斩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绢馍,長吁一口氣:“原來是場噩夢啊……” “哼向瓷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舰涌,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤猖任,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瓷耙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朱躺,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年搁痛,在試婚紗的時候發(fā)現(xiàn)自己被綠了长搀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸡典,死狀恐怖源请,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤谁尸,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布舅踪,位于F島的核電站,受9級特大地震影響症汹,放射性物質(zhì)發(fā)生泄漏硫朦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一背镇、第九天 我趴在偏房一處隱蔽的房頂上張望咬展。 院中可真熱鬧,春花似錦瞒斩、人聲如沸破婆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祷舀。三九已至,卻和暖如春烹笔,著一層夾襖步出監(jiān)牢的瞬間裳扯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工谤职, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饰豺,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓允蜈,卻偏偏與公主長得像冤吨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子饶套,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 數(shù)學是計算機技術的基礎漩蟆,線性代數(shù)是機器學習和深度學習的基礎,了解數(shù)據(jù)知識最好的方法我覺得是理解概念妓蛮,數(shù)學不只是上學...
    闖王來了要納糧閱讀 22,698評論 2 48
  • 一年級語文上冊生字表 生字表一(共400字) 啊(ā)愛(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang閱讀 2,798評論 0 6
  • 一前言 特征值 奇異值 二奇異值計算 三PCA 1)數(shù)據(jù)的向量表示及降維問題 2)向量的表示及基變換 3)基向量 ...
    Arya鑫閱讀 10,540評論 2 43
  • 10月4日怠李,中秋佳節(jié),內(nèi)心充滿喜悅蛤克,十月是豐收的季節(jié)捺癞,祈愿我的事業(yè)和財富也如此 感恩我能有機會學習金剛智慧,感恩父...
    京海家園閱讀 109評論 0 0
  • 今天突然看到這本書,拿起來重新翻閱儿倒,原來我早已看過的概念版保,現(xiàn)在才理解呜笑,才知道多么重要,一本好書彻犁,就是這樣叫胁,重新讀過...
    我的如意寶貝閱讀 103評論 0 0