——jzyshurak 18.4.8
為什麼一定要將本來只有兩維的點設為乙個\(1\cdot 3\)矩陣,原因在於,我們在處理所有操作時,必須使得每乙個操作矩陣都是正方形(顯然),然後加法矩陣需要有一維使得和座標的另一維乘積為0,而且必須點當中有一維為1,才能實現加法操作。然後,所有矩陣必須都是等大的,進而,所有本可以2*2的矩陣被強行擴大到3*3。
雖然矩陣不是數,但是它可以相乘。快速冪的本質其實是指數的二進位制拆分,對於相乘元素只要可以相乘即可。快速冪中所有元素都是相等的,不存在什麼交換律結合律什麼的。
其實並不是什麼二分,知道了元素個數可以o(1)知道中間元素,如果是就是就把它單獨拎出來算掉,然後遞迴即可。
考試的時候碰見了一道題,範圍是\(10^18\).
有兩種做法
我的做法是對於任意的n,將需要單獨拎出來的下標存在乙個陣列裡,然後預處理出來。直接處理顯然會t。我們發現,每乙個數a[i+1]和a[i]的關係很簡單,無非就是2,2+1,*2-1。除了-1我們都可以直接×2,然後再扯。對於-1的情況,我在開始dp的時候就弄乙個shadow矩陣,是\(t^\)。這樣的話,我無論下乙個數是不是-1的情況,我都讓這個shadow矩陣一直跟著我們dp的指標。這樣的話,我們就處理掉了-1的情況,時間複雜度變成了log
題解的做法是在快速冪的時候直接得到答案。做法是這樣的:首先,為什麼快速冪能恰好將n算完整?因為我們相當於將n二進位制拆分,之後對於是1的情況單獨處理。而這裡,我們在快速冪的時候順便將sum矩陣跟著求出來即可。-----------------2018.7.7
其實這道題可以用matrix67的方法,最本質的原因是這是置換。這意味著什麼?意味著我的操作矩陣和原序列是毫無關係的qwq,所以可以矩陣乘法加快速冪,即可。
求fibonacci第n項,n是\(2^-1\) (這反倒是我矩乘第一題)。這種問題可以得以解決關鍵在於這個遞推法則是固定的,而且和當前元素下標無關(如果和下標有關,那麼操作矩陣中必須存在變數,這樣就不符合快速冪的本質(交換律))。
顯然,通過這道題,我們可以大致的猜想到:任意的\(a_n=\sum\limits_^ h_i\cdot a_i\) ,(h是固定係數,sum是固定遞推項數),都可以通過矩陣快速冪解決。
jloi2018 d2 t1裸題
就是說構造鄰接矩陣時候,我們矩陣中i行j列的元素,在第k個答案矩陣上,表示從i到j花費k步的方案數。然後。然後,將當前答案矩陣乘上原來的鄰接矩陣,如果能對當前點有更新,當且僅當兩點之間連邊。
即:\(a_=\sum\limits_^a_\cdot c_\) 其中,\(a_\) 表示從i到j用k步的方案數,mid可以看做列舉到達j的上乙個點,\(c_\) 表示兩點是否連通。這恰好列舉了所有情況,其中\(c_\) 為0。
之後,求鄰接矩陣的k次快速冪,詢問的話,輸出答案即可。
額外鏈結
和例題8類似,只不過這題的鄰接矩陣的建立需要花乙份兒功夫,建立了所謂的鄰接矩陣之後,快速冪即可。
特別地,我們對於兩個病毒片段的轉移構造鄰接矩陣(詳情說的很清楚)。然後同理,矩乘快速冪即可。
歡迎大家幫忙指正
然後我就在網上各處找答案,祈求著可以解 標題決這個問題,然鵝,也許就真的是因為是個太小的問題,或者說我太粗心,居然木有找到。然後萬念俱灰之時發現輸出的擠的太緊不好看。然後我就在tostring遍歷裡面加了個空格,讓大家分開點,想看的更清楚一點。然後他就變了!這個輸出結果!居然變了,原來死活出不來的c...
OSGi學習摘記
最近在學習osgi框架,這篇部落格就當做學習筆記吧。及時更新。osgi是基於不同classloader載入不同的資源模組,而以前的開源框架,例如 hibernate spring sturts等都是基於統一管理和唯一的classloader來設計開發。所以osgi在整合其他框架時需要做特殊處理。im...
Lua學習摘記
lua的物件導向實現很有趣,lua的基本資料型別有8個 nil number string boolean function table userdata thread 其中的table就是實現物件導向的重中之重 lua對table的一些機制設計十分巧妙,只需要熟悉這些機制 用簡潔的 就能實現物件導...