[OI笔记]关于一类带∑的式子的快速求和
\(S(n) = \sum\limits_{i<=n} 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_{i=0}^{k+1}(-1)^i\binom{k+1}{i}g(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)\)插值做自然数幂和\(.\)