1. 程式人生 > >2018.12.31【NOIP訓練】偶數個5(生成函式)(快速冪)

2018.12.31【NOIP訓練】偶數個5(生成函式)(快速冪)

傳送門


解析:

a n a_n n n 位數中出現偶數個 5

5 的數的個數, b n b_n n n
位數中出現奇數個 5 5 的數的個數。

顯然我們有以下遞推方程組:
{

a 1 = 8 , b 1 = 1 a n = 9 a n 1 + b n 1 b n = 9 b n 1 + a n 1 \left\{ \begin{aligned} &a_1=8,b_1=1 \\ &a_n=9a_{n-1}+b_{n-1}\\ &b_n=9b_{n-1}+a_{n-1} \end{aligned} \right.

{ a n } , { b n } \{a_n\},\{b_n\} 的生成函式分別為: A ( x ) = a 1 + a 2 x + . . . + a n x n 1 + . . . A(x)=a_1+a_2x+...+a_nx^{n-1}+... B ( x ) = b 1 + b 2 x + . . . + b n x n 1 + . . . B(x)=b_1+b_2x+...+b_nx^{n-1}+...

推一下可以得到兩個式子 ( 1 9 x ) A ( x ) x B ( x ) = a 1 = 8 (1-9x)A(x)-xB(x)=a_1=8 ( 1 9 x ) B ( x ) x A ( x ) = b 1 = 1 (1-9x)B(x)-xA(x)=b_1=1

解得: A ( x ) = 8 71 x ( 1 8 x ) ( 1 10 x ) = ( 7 1 8 x + 9 1 10 x ) / 2 A(x)=\frac{8-71x}{(1-8x)(1-10x)}=(\frac{7}{1-8x}+\frac{9}{1-10x})/2

利用公式 1 1 x = 1 + x + x 2 + x 3 + . . . \frac{1}{1-x}=1+x+x^2+x^3+... 將上式展開得到 A ( x ) = ( 7 i = 0 ( 8 x ) i + 9 i = 0 ( 10 x ) i ) / 2 A(x)=(7\sum_{i=0}^{\infty}(8x)^i+9\sum_{i=0}^\infty (10x)^i)/2

所以對應的係數: a n = ( 7 × 8 n 1 + 9 × 1 0 n 1 ) / 2 a_n=(7\times 8^{n-1}+9\times 10^{n-1})/2

程式碼實現很簡單,就不貼了,不過因為巨大的模數導致輸出很多,需要輸出優化。