pn)其中p為1−n的任意乙個排列,τ(p)表示排列p逆序對數
形象的表示就是
在這個n=3的矩陣中,每一條線就代表著d1
,p1×
d2,p
2×d3
,p3×
...×
dn,p
n d1,
p1×d
2,p2
×d3,
p3×.
..×d
n,pn
其中可以發現,相連的斜線為/就會讓逆序對數+1,\就不增加
具體怎麼算呢?
比如說上圖中的淡藍色吧,ta的排列是3 1 2,逆序對應該是2
看斜線的話
一開始是/,t++,t=1,ans+=t,ans=1
然後\,t不變,t=1,ans+=t,ans=2
要是向上面一樣模擬的話。。。狀態就有n!個,還需要乙個個算的話想想就害怕
如果要快速計算行列式,我們需要知道行列式的性質
性質一:
乙個矩陣行列互換(a』[i][j]=a[j][i])得到矩陣a』,det(a)=det(a』)
這個似乎顯然咯
性質二:
互換行列式兩行或兩列的位置,det(a』)=-det(a)
那麼我們有乙個很好的推論:若矩陣第i行與第j行的值完全相同,det=0,因為交換這兩行(列)得到的矩陣和以前一樣,而det為相反數,則det=0
性質三:
矩陣a中某一行的元素全部乘以常數k,則det(a』)=k*det(a)
根據行列式的定義式,可以發現,每一行肯定會在每乙個狀態裡出現乙個屬於這一行的數字,因為這一行每乙個數字都擴大了k倍,可以給每乙個狀態帶來k倍的貢獻,得證
性質四:
若存在1<=i,j<=n,k為實數滿足a[i][l]=k*a[j][l]對於所有1<=l<=n均成立,則det(a)=0
根據2、3性質可以得到,可以把常數k提出來,然後兩行相等的話det=0,所以0*k=0
性質五:
將第i行所有元素加上任意其他行元素的實數倍,det(a)不變
證明: 考慮排列p1,p2,p3…..pn對於答案的貢獻
原始矩陣:s1=sign*a[1][p1]* a[2][p2]*….*a[n][pn]
新矩陣: s2=sign*a[1][p1]* a[2][p2]… a[n][pn]+sign*k * a[1][p1]* a[2][p2].. a[j][pi]*..a[n][pn]
而△=sigma(s2-s1)=0,因為△=後面加的一串,看看性質四可以發現後面的=0,所以得證
怎麼快速求行列式的值呢?這裡給出結論
對於第i行,我們希望將滿足i+1<=j<=n的a[j][i]的值變為0,也就是用高斯消元的方法消成乙個上三角,然後把a[i][i]這一部分的值乘起來就好了。
為什麼呢?因為求這個變化後的矩陣和原來的矩陣行列式一樣,也就是轉化為求這個矩陣的行列式,可以發現除了排列pi
=ip i=
i之外,別的排列給出的貢獻都是0,所以把a[i][i]乘起來就好了
注意每次交換兩行的時候要記錄次數,如果是奇數,答案還要乘上-1
這樣就可以o(n^3)實現矩陣行列式的求解。
求乙個圖的生成樹個數,首先構造度數矩陣d和鄰接矩陣a
基爾霍夫矩陣k=d−a
我們去掉k矩陣的第n行和第n列,然後用高斯消元(取模情況下要使用輾轉相除的高斯消元)得到新矩陣的上三角形
對角線乘積的絕對值(a[i][i])就是生成樹個數
這裡獻上裸題:spoj high
#include
#include
#include
#include
#define ll long long
using
namespace
std;
const
double eps=1e-9;
const
int n=20;
int n;double a[n][n],ans;
void gauss()
for (int j=i;j<=n;j++) swap(a[num][j],a[i][j]);
opt^=1;
}for (int j=i+1;j<=n;j++)
}for (int i=1;i<=n;i++) ans*=a[i][i];
if (opt==1) ans*=-1;
}int main()
n--;gauss();
printf("%.0lf\n",ans);}}
參考blog:dalaoa,dalao 矩陣樹定理學習筆記
對矩陣 a begina a a dots a a a a cdots a vdots vdots vdots ddots vdots a a a dots a a a a dots a end 它的行列式定義為 det a sum 1 ra a cdots a 其中 p 是 1 sim n 的排列...
矩陣樹定理學習筆記
這也是乙個黑科技 設乙個無向圖的鄰接矩陣為 a 度數矩陣為 d 則基爾霍夫矩陣 k d a 的行列式的值就是生成樹的個數。注意這裡的 k 是要把最後一行和最後一列去掉的。證明?不存在的 它還有乙個擴充套件,叫做變元矩陣樹定理 若將鄰接矩陣的 a i j 設為邊權,度數矩陣的 d i i 設為與 i ...
矩陣樹定理學習筆記
本篇部落格僅針對定理的應用 實現進行總結,至於證明 前人之述備矣 所以這裡就不贅述了。我絕對不會告訴你,是因為博主又笨又懶不會證!kirchhoff 矩陣樹定理 簡稱矩陣樹定理 用於解決一張圖的生成樹個數計數問題。對於 個 向圖 g 它的 成樹個數等於其基爾霍夫 kirchhoff 矩陣任何 個 n...