[Luogu]P5110 块速递推

\(Link\)

Description

给定一个数列\(a\)满足递推式\(a_n=233a_{n-1}+666a_{n-2},a_{0}=0,a_{1}=1\)

求这个数列第\(n\)项模\(10^9+7\)的值,一共有\(T\)组询问

Solution

看到这种\(a_n=pa_{n-1}+qa_{n-2}\)的式子,就用特征方程来解。(把\(a_n\)设成\(\alpha x_1^n+\beta x_2^n\)的形式)

(下面是蒯的)

\(x^2=233x+666\)

\(x^2-233x-666=0\)

\(x_1=\frac{233+\sqrt{56953}}2,x_2=\frac{233-\sqrt{56953}}2\)

\(\therefore a_n=\alpha x_1^n+\beta x_2^n\)

\(\because a_0=0,a_1=1\)

\(\therefore \begin{cases} \alpha+\beta=0\\ \alpha x_1+\beta x_2=1 \end{cases}\)

\(\therefore \begin{cases} \alpha=\frac1{\sqrt{56953}} \\ \beta=-\frac1{\sqrt{56953}} \end{cases}\)

\(\therefore a_n=\frac1{\sqrt{56953}}\left(\left(\frac{233+\sqrt{56953}}2\right)^n-\left(\frac{233-\sqrt{56953}}2\right)^n\right)\)

\(\because 188305837 \equiv \sqrt{56953} \; (\text{mod}\;10^9+7)\)\(((188305837^2\equiv56953\pmod{10^9+7})\)

\(\therefore a_n \equiv 233230706 \times\left(94153035^n-905847205^n\right)\)

考虑到矩阵有循环节,本题为\(1e9+6\)。即每\(10^9+6\)个数循环一次。所以\(n\)的范围可以变成\(int\)

然后我去学了学光速幂:

当我们要多次求一个给定底数的\(p\)次幂对给定模数\(mod\)取模的值时,可以做到\(O(1)\)

具体实现也很简单。因为\(x^n=x^{(n/p)*p}*x^{n\%p}\),所以我们预先算出\(x^{pn}\)\(x^n\),就可以了。

\(p\)一般取\(log(max\_n)\),然后\(n\)\(\forall{n}\in[1,log(max\_n)]\)即可。

这里有一个小技巧:\(x\%p\)可以表示为\(x\&(p-1)\)

posted @ 2020-10-20 17:30  andysj  阅读(66)  评论(0编辑  收藏  举报