洛谷 P2144 FJOI2007 輪狀病毒

2022-06-01 08:57:15 字數 3785 閱讀 4510

求一種特殊無向圖的生成樹個數

無向圖如圖:

用matrix-tree定理,求出基爾霍夫矩陣來計算,再遞推答案;

\(ans(x)=3\times ans(x-1)-ans(x-2)+2\)

我們令輪狀病毒圓心編號為1,圓環上點編號從2~n+1

則可以得出無向圖的度數矩陣d和鄰接矩陣e

\(d=\beginn&0&0&0&0&\cdots&0&0&0&0\\0&3&0&0&0&\cdots&0&0&0&0\\0&0&3&0&0&\cdots&0&0&0&0\\0&0&0&3&0&\cdots&0&0&0&0\\0&0&0&0&3&\cdots&0&0&0&0\\\vdots&\vdots&\vdots&\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots\\0&0&0&0&0&\cdots&3&0&0&0\\0&0&0&0&0&\cdots&0&3&0&0\\0&0&0&0&0&\cdots&0&0&3&0\\0&0&0&0&0&\cdots&0&0&0&3\\\end\)

\(e=\begin0&1&1&1&1&\cdots&1&1&1&1\\1&0&1&0&0&\cdots&0&0&0&1\\1&1&0&1&0&\cdots&0&0&0&0\\1&0&1&0&1&\cdots&0&0&0&0\\1&0&0&1&0&\cdots&0&0&0&0\\\vdots&\vdots&\vdots&\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots\\1&0&0&0&0&\cdots&0&1&0&0\\1&0&0&0&0&\cdots&1&0&1&0\\1&0&0&0&0&\cdots&0&1&0&1\\1&1&0&0&0&\cdots&0&0&1&0\\\end\)

再得到基爾霍夫kirchhoff矩陣 \(k=\beginn&-1&-1&-1&-1&\cdots&-1&-1&-1&-1\\-1&3&-1&0&0&\cdots&0&0&0&-1\\-1&-1&3&-1&0&\cdots&0&0&0&0\\-1&0&-1&3&-1&\cdots&0&0&0&0\\-1&0&0&-1&3&\cdots&0&0&0&0\\\vdots&\vdots&\vdots&\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots\\-1&0&0&0&0&\cdots&3&-1&0&0\\-1&0&0&0&0&\cdots&-1&3&-1&0\\-1&0&0&0&0&\cdots&0&-1&3&-1\\-1&-1&0&0&0&\cdots&0&0&-1&3\\\end\)

然後我們要求k的代數余子式的值,顯然是將帶有n的那一行,那一列(即第一行,第一列)去掉

接下來就是求n階行列式\(a=\begin3&-1&0&0&\cdots&0&0&0&-1\\-1&3&-1&0&\cdots&0&0&0&0\\0&-1&3&-1&\cdots&0&0&0&0\\0&0&-1&3&\cdots&0&0&0&0\\\vdots&\vdots&\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots\\0&0&0&0&\cdots&3&-1&0&0\\0&0&0&0&\cdots&-1&3&-1&0\\0&0&0&0&\cdots&0&-1&3&-1\\-1&0&0&0&\cdots&0&0&-1&3\\\end\)

對於a,顯然不能用\(n^3\)的高斯消元,所以我們要**a的性質。

將a的第一行變換到最後一行,得到\(b=\begin-1&3&-1&0&\cdots&0&0&0&0\\0&-1&3&-1&\cdots&0&0&0&0\\0&0&-1&3&\cdots&0&0&0&0\\0&0&0&-1&\cdots&0&0&0&0\\\vdots&\vdots&\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots\\0&0&0&0&\cdots&-1&3&-1&0\\0&0&0&0&\cdots&0&-1&3&-1\\-1&0&0&0&\cdots&0&0&-1&3\\3&-1&0&0&\cdots&0&0&0&-1\\\end\)

先根據行列式的性質得到\(a=(-1)^\times b\)

我們發現除了左下角有三個數字外,b已經是乙個上三角行列式,接下來是要消去左下角的三個數字

先消第n-1行(倒數第二行)

假設現在在消第i位,設\(f_i\)表示這一行的第i個數,\(g_i\)表示這一行第i+1個數

那麼我們可以將b的第i行\(\times f_i\)加到這一來,就可消去第i位。因為第i行-1後面一定是3,所以第i+1位\(+3\times f_i\)同理,第i+2位\(+(-f_i)\)。

即\(\beginf_=g_i+3\times f_i\\g_=-f_i\\\end\)

由第二個式子推出\(g_i=-f_\)帶人第乙個式子中,得到\(f_=3\times f_i-f_\),同時也可得到\(g_=3\times g_i-g_\)

然後可以快速地將第n-1行消成\(\begin0&0&0&0&\cdots&0&0&f_-1&g_+3\end\) 了

同樣的方法,我們可以來消第n行

設第i位為\(h_i\),第i+1位為\(l_i\)

可得方程

\(\beginh_=l_i+3\times h_i\\l_=-h_i\\\end\)

解得\(h_=3\times h_i-h_\qquad l_=3\times l_i-l_\)

將第n行消成\(\begin0&0&0&0&\cdots&0&0&h_&l_-1\end\)

設\(f_-1=f\qquad g_+3=g\qquad h_=h\qquad l_-1=l;\)

則\(b=\begin-1&3&-1&0&\cdots&0&0&0&0\\0&-1&3&-1&\cdots&0&0&0&0\\0&0&-1&3&\cdots&0&0&0&0\\0&0&0&-1&\cdots&0&0&0&0\\\vdots&\vdots&\vdots&\vdots&\ddots&\vdots&\vdots&\vdots&\vdots\\0&0&0&0&\cdots&-1&3&-1&0\\0&0&0&0&\cdots&0&-1&3&-1\\0&0&0&0&\cdots&0&0&f&g\\0&0&0&0&\cdots&0&0&h&l\\\end\)=\((-1)^\times \beginf&g\\h&l\\\end\)

所以\(a=(-1)^\times b=(-1)^\times \beginf&g\\h&l\\\end=-f\times l+g\times h\)

再推一推f,g,h,l,可以看出

\(h_=l_=f_=g_\)

最後就可以推出\(ans(n)=3\times ans(n-1)-ans(n-2)+2\)了

如果推不出,也可以求出\(f_,f_,f_\)再來求答案

#include #include #include int n;

struct number

void operator =(const number x)

void operator +=(const number x)

if (num[len+1]) ++len;

} void operator -=(const number x)

while (!num[len]) --len;

} number operator *(const int& x)

res.len=len;

if (res.num[len+1]) ++res.len;

return res;

} void print()

} x,y,z,_2;

int main()

z.print();

}}

題解 P2144 FJOI2007 輪狀病毒

題目鏈結 題目大意 給定一張圖,求生成樹數量 矩陣樹定理 分析 矩陣樹定理裸題,唯一噁心人的地方就是要寫高精度 但是作為乙個python愛好者 其實就是懶 我們怎能就此束手就擒,乖乖按照毒瘤出題人的意願寫高精?python 30行解決戰鬥 n int input maxn 128 deg 0 for...

洛谷 P2007 魔方

常神牛從來沒接觸過魔方,所以他要借助計算機來玩。即使是這樣,他還是很菜。常神牛家的魔方都是3 3 3的三階魔方,大家都見過。更正 3 4以圖為準。作為一名菜鳥,常神牛從網上搜了一篇攻略,並找人翻譯成了他自己會做的方法。現在告訴你他的魔方情況,以及他從網上搜到的攻略,請你求出最後魔方變成什麼樣子。輸入...

洛谷P4609 FJOI2016 建築師

小 z 是乙個很有名的建築師,有一天他接到了乙個很奇怪的任務 在數軸上建 n 個建築,每個建築的高度是 1 到 n 之間的乙個整數。小 z 有很嚴重的強迫症,他不喜歡有兩個建築的高度相同。另外小 z 覺得如果從最左邊 所有建築都在右邊 看能看到 a 個建築,從最右邊 所有建築都在左邊 看能看到 b ...