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

  • 相关阅读:
    前三次复利计算程序的总结
    Compound Interest Calculator3.0
    Compound Interest Calculator2.0
    Compound Interest Calculator1.0
    操作系统第一次作业
    学习进度条
    0302感想和问题回答
    1231递归下降语法分析程序设计
    1211有限自动机构造与识别
    5份Java面经
  • 原文地址:https://www.cnblogs.com/andysj/p/13847777.html
Copyright © 2011-2022 走看看