\(s(n) = \sum\limits_ i^ka^i\)
這個式子**於sp19997。
魚神的題解裡提到,\(s(n)\)這樣的式子,可以寫成更通用的形式:
\(s(n) = \sum f(i)a^i (i <= n),\)在本題中,\(f(i) = i^k\)
同時也有乙個窩不會證明的神仙結論:
存在乙個次數不高於 \(k\) 的多項式 \(g(x)\),使得 \(s(n)=a^ng(n)-g(0)\)
也就是說,我們只要知道\(g(n)\)和\(g(0)\),就可以快速求出這個式子。
然後我們很容易推得 \(g(n)=(g(n-1)+f(n-1))/a\)
又因為\(g(n)\)是\(k\)次多項式,所以\(k+1\)次差分後其必然是\(0\),即
\(\sum\limits_^(-1)^i\binomg(k+1-i)=0\)
然後設個未知數,把\(g(0)...g(k)\)都解出來,就可以插值求出\(g(n)\)了
然後就沒了。
複雜度\(o(k)\)
\(upd\)
\(on\)
\(2020.4.28:\)
為什麼這個做法有時候會出鍋呢\(?\)
主要是因為這個做法設未知數解方程的過程中可能出現
\(ax=c,a=0,c\neq 0\)的情況或者\(ax=c,a=0,c=0\)的情況\(.\)
這時候一般來說是可以特判的\(,\)比如說當\(f(i) = i^0 = 1\)的時候就可以直接\(o(k)\)插值做自然數冪和\(.\)
OI 關於快速冪的簡單理解
快速冪 因為a b c n a n b n c 所以n m可以分解為n m n a1 n a2 n a3.n ak a1 a2 a3.ak m 所以我們想到,如果存在k我們都知道二進位制轉十進位制時,是對每一位呈上位權,而計算機可以對十進位制數進行位運算,通過位運算可求出二進位制的每一位,tobe ...
帶自加加這一類常會出現的錯誤
只能說,有些錯誤實在太隱蔽了,剛覺得自己會考慮如何更簡潔優化的寫出程式了,但是反而會因為自己的進一步而犯進一步的錯誤 但這是另人高興的錯誤是不哈哈,不能因為怕犯錯誤而不向前 例子來自經典教材 看似兩個一樣的程式,自加類常回出現這種錯覺 void twiddle1 int xp,int yp void...
C 類的理解 一) 類的初識
一 類的意義,以及類與物件 類的內容比較多,但類是物件導向的基礎,所謂物件導向 object 其實就是一種更高層次的模組化,也稱為封裝。c語言中,稍微複雜點的資料結構都是用結構體來寫的,結構體本質上就是把一些相關的資訊打包儲存,比如貓 struct cat 這樣我們通過鍵盤輸入很多貓的資訊就可以用結...