zoukankan      html  css  js  c++  java
  • [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)\)

  • 相关阅读:
    《最小割模型在信息学竞赛中的应用》最大权闭合图
    《最小割模型在信息学竞赛中的应用》最优标号
    《最小割模型在信息学竞赛中的应用》网络战争
    P3254 圆桌问题
    P2766 最长不下降子序列问题
    P2754 星际转移问题
    洛谷P2756 飞行员配对方案问题
    状态压缩dp 炮兵阵地
    状态压缩—玉米田
    CCF 202006-2 稀疏向量
  • 原文地址:https://www.cnblogs.com/andysj/p/13847777.html
Copyright © 2011-2022 走看看