csuoj 古怪的行列式

2021-08-20 19:39:06 字數 1643 閱讀 4913

這幾天,子浩君潛心研究線性代數。 行列式的值定義如下:

子浩君很厲害的,但是頭腦經常短路,所以他會按照行列式值的定義去計算,這個行列式子浩君也還是能算對的。但是,在計算的過程中,如果出現連續三行選取的元素為83(s),83(s),82(r)的話,子浩君會忍不住拿走它們:-d,然後這三個數的乘積將被視為1,而其它數值計算不變。那麼在子浩君的計算下,最後得到的行列式的值會為多少呢?

資料第一行為乙個整數t(t<=50)。 接下來有t組測試資料,每組資料開始有乙個整數n(2<=n<=8)。 接下來有n行數字,每行有n個數字,第ith行第jth個數字代表矩陣的第ith行第jth列的數字,保證每個數字在int範圍內的非負整數。

輸出乙個整數,保證在[-(2^63-1), 2^63-1]範圍內,即使在子浩君計算過程中也是。

4

21 1

0 13

83 1 1

0 83 1

0 0 82

383 1 1

0 82 1

0 0 83

383 1 1

0 83 1

0 1 82

1

1564898

-82

例如,當子浩君遇到a11 * a22 * a33 * a44 = 83 * 83 * 82 * 1,會計算成1 * 1 = 1,而83 * 82 * 83 * 1或者83 * 83 * 1 * 82則不會改變運算規則

思路:考慮資料量,暴力即可。比較繁瑣的是按行列式的規則計算

#includeconst int max = 10;

long a[max][max]; //行列式

int n;

bool mark[max]; //每列是否被選擇,false為未選

long number[max]; //每行選擇的列號

long sum = 0;

void choose(int, int); //窮舉行列式的所有選擇情況

int inversion_number(); //計算逆序數

void choose(int row)

}long res = 1;

long temp[max];

for (int i = 1; i <= n; i++)

temp[i] = a[i][number[i]];

for (int i = 1; i <= n - 2; i++)

}for (int i = 1; i <= n; i++)

res *= temp[i];

int j = inversion_number();

if (j % 2 == 1)

res = -res;

sum += res;

return;

}bool use[max];

for (int i = 1; i <= n; i++)

use[i] = mark[i];

for (int i = 1; i <= n - row + 1;) //窮舉的次數}}

}int inversion_number()

return cnt;

}int main()

return 0;

}

CSUOJ 1979 古怪的行列式

這幾天,子浩君潛心研究線性代數。行列式的值定義如下 其中,j1j2.jn 為排列j1j2.jn的逆序數。子浩君很厲害的,但是頭腦經常短路,所以他會按照行列式值的定義去計算,這個行列式子浩君也還是能算對的。但是,在計算的過程中,如果出現連續三行選取的元素為83 s 83 s 82 r 的話,子浩君會忍...

CSU1989 古怪的行列式 模擬

這幾天,子浩君潛心研究線性代數。行列式的值定義如下 子浩君很厲害的,但是頭腦經常短路,所以他會按照行列式值的定義去計算,這個行列式子浩君也還是能算對的。但是,在計算的過程中,如果出現連續三行選取的元素為83 s 83 s 82 r 的話,子浩君會忍不住拿走它們 d,然後這三個數的乘積將被視為1,而其...

行列式求值

行列式求值法則 傳送門 行列式求值,說白了就是用高斯消元把行列式消成上三角或者下三角 這裡選擇消成上三角,其實都一樣 用到的就是行列式求值的幾條性質,我這裡是用了乙個變數reo來記錄行列式的值 1 include2 include3 include4 include5 include6 includ...