因為博主太菜了所以需要寫筆記來加深理解。
感謝隊爺 cly 對我的耐心指導。
\(\to\)
矩陣其實可以看成若干向量。
關於這部分,引入一些奇怪的知識(說奇怪是因為我目前沒有用到過):
hehezhou 給了我又一種理解矩陣乘法的方式。
矩陣中的元素 \(a_\) 表示從點 \(i\) 到點 \(j\) 的方案數。
若是從這個角度的話就可以快速地理解一些東西了。
如何把乙個矩陣轉化成我想要的樣子呢?
這裡我不知道怎麼寫比較好的引子,就直接上正題了吧。
在講這塊之前,需要一些前置知識:
矩陣的初等變換有三種:
\(1.\) 交換某兩行(注意對應到矩陣的乘法中,需要左乘初等變換矩陣,若右乘即為交換兩列)。
\(2.\) 將某一行乘上乙個非零實數 \(k\)。
\(3.\) 將某一行的 \(k\) 倍(向量內每個元素都變成原來的 \(k\) 倍的意思)加到另一行上。
那麼應該如何實現這三種操作呢?
單位矩陣是乙個只有主對角線上的元素為一,其它都為零的 \(n\times n\) 的矩陣,擁有任何矩陣乘上單位矩陣都是自身的良好性質,可以模擬為普通乘法中的 \(1\)。
那麼若是我們對單位矩陣進行上述的初等變換,然後再將我們想進行操作的矩陣乘上這個得到的東西,是否就可以得到我們想要的結果?
小編也很驚訝,但事實就是這樣。
你可以從定義或者上面描述的乘法的角度去理解。
對單位矩陣進行一次初等變換得到的東西,稱為初等矩陣。
你會發現這個東西妙得很,可以做高斯消元,因為高斯消元需要的操作無非也是這幾種。
並且你會發現,需要的是左乘初等矩陣,因為右乘會對列進行操作。
若是乙個矩陣可以進行若干次初等變換變成單位矩陣,那麼便稱之為是可逆的。
但是具體的**實現裡面,並不需要真正去構建這種矩陣來轉換,更多的是用於一些推導和證明。因為如果真的要實現那三種變換,直接按照定義去實現就好了。
定義乙個矩陣 \(a\) 的逆 \(b\),滿足 \(ab=ba=e\),其中 \(e\) 表示單位矩陣。
具體的求法,我們可以將 \(e\) 拆分為 \(a\) 和若干個初等矩陣的乘積:\(x_1 x_2 \cdots a\),也就是說,\(a\) 可經過若干次初等變換得到 \(e\)。對於上面那個等式,我們左右同時左乘上這若干個初等矩陣,就得到了 \(eb=x_1 x_2 \cdots e\),那麼 \(b=x_1 x_2 \cdots e\)。
那麼如果不滿足那個拆分的 \(a\) 呢?答案是 \(a\) 無逆,這點在之後的行列式求值也可以相聯絡。
這個我感覺沒有什麼特別好講的,利用前面的初等變換,進行平時解方程組的操作,不斷消去未知數。
這裡引入乙個增廣矩陣的概念,具體的,將未知數係數表示成乙個係數矩陣\(a\),常數項單獨作為乙個矩陣(也可以叫做向量)\(x\),那麼增廣矩陣\(b=(a|x)\),是這樣乙個表示形式。這個定義會在後面用到。
那麼 \(b\) 也是一樣可以通過一系列變換變成階梯型矩陣的。
式子我就不寫了,網上都有。
樸素地求行列式的複雜度是 \(\operatorname o(n!(n \log+n))\)(大概)
反正也不會真有人去暴力做這個東西。
利用行列式的一些性質來進行求解:
\(1.\) 交換某兩行。行列式取負。
\(2.\) 將某一行乘上乙個非零實數 \(k\)。行列式乘上 \(k\)。
\(3.\) 將某一行的 \(k\) 倍(向量內每個元素都變成原來的 \(k\) 倍的意思)加到另一行上。行列式不變。
\(4.\) 乙個矩陣若是有逆,則其行列式為逆矩陣的逆元(若是取模意義下的話),否則行列式為 \(0\)。
那麼就是一樣去做高斯消元的過程求逆矩陣(當然實際並不用求出這個逆),然後對行列式進行計算。
這裡的計算部分有一種很巧妙的寫法:將 \(a\) 消成上三角矩陣以後,將對角線元素相乘即為答案。至於為什麼,可以自己推導一下,很有意思的。
以及,在這個過程中,如果說當前求行列式的矩陣不可逆,那麼必然會在若干步初等變換後,出現某個對角線上的元素為 \(0\) 的情況,那麼顯然矩陣的行列式為 \(0\)。
也就是說:矩陣有逆 \(\leftrightarrow\) 矩陣行列式不為 \(0\)。反之也是成立的,這樣可以使得行列式與矩陣求逆聯絡在一起。
rt,如何計算最小生成樹的方案數呢?
構造乙個基爾霍夫矩陣,然後求出去掉最後一行和最後一列以後的行列式。
注:基爾霍夫矩陣中 \(a_\) 表示點 \(i\) 的度數,\(a_,i!=j\) 表示鄰接矩陣中 \(a_\) 的相反數。(連邊數取反)
這題因為是對非質數取模,所以需要進行輾轉相除。輾轉相除的原理導致其跑完一遍只能將其消成上三角矩陣。然後這個過程中行列式只會有正負的變化,那麼所有的 \(1\) 操作對行列式的貢獻在上三角矩陣中就已經可以直接相乘求得了。
本身是需要將其 \(\times \frac\),但因為最後還要倒過來,所以就直接乘 \(c\) 計算就好了。
同時提醒我們,因為行列式跑的是最小生成樹的方案數,所以若是塞進去無用的點會導致方案數變為 \(0\)。
輾轉相除不得往回消。
也可以算作是板題,不過套了個簡單容斥。
如何證明:按邊權排序分層後,相同權值的邊選取可行的 \(k\) 條對後面的層無影響,也就是無後效性。若是正確,則可以應用乘法原理來計算方案數,因為層層之間實際上獨立。
在 kruskal 執行的過程中,對於 \(x\) 條相同權值的邊,從中選取 \(k\) 條邊保證選取後圖為森林,這樣形成的所有聯通塊的內部資訊(只考慮有哪些節點,連線方案無所謂)是相同的。
考慮反證法,若不相同,則一定存在一條當前權值的邊連線某兩個聯通塊,使得這兩者合併。
雙倍經驗 (甚至連**都不用改,省選直接放兩年前原題可還行)
對於這種分層的需要注意:
簡單來說,秩就是:矩陣內部的極大線性獨立向量的數目,自然有行列之分。
線性獨立的一些向量,如果刪去了某乙個,那麼它就不能被剩下的向量給表示出來。
更嚴謹的定義可以去網路上搜尋,這裡不過於詳細地介紹。因為實際用處不大
現階段,你大概只需要知道:秩就是高消出來的階梯形矩陣的主元個數。
定義 \(r(a)\) 表示矩陣 \(a\) 的秩。
按照每個開關的效果構造出對應的向量,將它們轉化為若干線性無關的向量,然後根據題意判斷即可。
這裡就可以用到前面那個定義了。對於 \(b=(a|x)\),分討一下(已經通過高消轉成線性無關的若干向量):
線性基指的是能夠用向量集合中若干向量通過線性運算得到表示出來的向量集合。
更公式化地,可以描述為:對於線性無關的 \(n\) 個向量 \(x_1,x_2\cdots x_n\),所有可以表示為 \(a_1x_1+a_2x_2+\cdots a_nx_n\) 的向量組成的集合,就是乙個線性基。
線性基可以用若干個線性無關的向量來描述,而高消的過程,實質上就是將這些線性無關向量求出的過程。
是支援動態插入維護的線性基。ll val[53];
inline void insert(ll x)x^=val[i];}return;}
通過高消得到的階梯型矩陣,滿足每個主元列上,除了主元以外其他元素都為 \(0\)。
根據這個性質,我們就可以貪心選取了。
這道題考察大家對於線性基知識的掌握程度,然後用這些知識寫出轉移方程式。
紀念一下第一次在 vj 上拿 rank 1。
這裡面的題目都還不錯,除了毒瘤高精 e。
下面五道是我覺得非常妙的,可以從中學到不少技巧性的東西。比如說如何構建轉移矩陣,以及矩陣和一些演算法的經典組合運用。
經典多合一。
考驗矩陣運算性質的運用。
兩個套路結合起來的題。
算是這之中比較簡單的一道。
其實和線性代數關係並不是非常大,是道妙妙亂搞。
線性代數學習筆記
前置芝士 序列逆序對個數 tau a 1a 2a 3 cdots a n displaystyle sum 性質1 交換序列中相鄰的兩個數會改變原序列逆序對個數的奇偶性 性質2 交換序列中不相鄰的兩個數也會改變原序列逆序對個數的奇偶性 證明 a 1.a i.a j.a n 不斷將ai與它右邊的數字交...
線性代數學習筆記(七)
證明分兩步 與高斯消元法相比,公式法的優缺點 x的每個分量 x i 是兩個行列式的商 克拉默法則解方程組的代價比較大,需要解n 1個行列式,而解行列式是非常expensive的,因此也只有公式的價值,不能用其作為程式設計計算方法。書中是先得到cramer法則,再得到逆矩陣公式,求cramer法則的方...
線性代數學習筆記(六)
只有正方形的矩陣有行列式!行列式的應用概括來有三 性質1,2,3是basic properties,用這三條性質可以計算任意乙個矩陣的行列式 a 性質1和2一起就可以推導出permutation matrix的行列式了 線性變換 數乘,加減 這很像長方形的邊與面積的關係 長 第一行 2,寬 第二行 ...