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)\)。