zoukankan      html  css  js  c++  java
  • [学习笔记]Cayley-Hilmiton

    CayleyHamilton theorem - Wikipedia

    其实不是理解很透彻,,,先写上

     

     

    简而言之:

    是一个知道递推式,快速求第n项的方法

    k比较小的时候可以用矩阵乘法

    k是2000,n是1e18呢?

     

    思想:求出开始的k项的每一项对第n项的贡献

    特征多项式,,

    fibonacci:

    f[n]=f[n-1]+f[n-2]

    x^2=x+1

    推广:

    f[n]=af[n-1]+bf[n-2]

    x^2=ax+b*1

    再推广:

    f[n]=a1f[n-1]+a2f[n-2]+...+akf[n-k]

    x^k=a1x^(k-1)+...+ak

    特征多项式就是左边移动过去:x^2-x-1=0

    其实本质是:

    x是转移矩阵。

    必然有x^2-x-1=0成立 

    具体的证明以及用法

    $B*A^n=F_n$

    $B*A^{n-1}=F_{n-1}$

    ...

    $B*A^{n-k}=F_{n-k}$

    如果有:$F_n=sum_{i=1}^k ai*F_{n-i}$

    那么可以把第一个式子减去后面k个等式的乘上$a_i$的和得到:

    $B*(A^n-a_{1}A^{n-1}-.....-a_{k}A^{n-k})=0$

    必然有:$(A^n-a_{1}A^{n-1}-.....-a_{k}A^{n-k})=0$

    不妨用x来代替A

    $x^{k}-sum_{i=0}^{k-1} a_0*x^{k-1-i}=0$

    对于$x^n$,一定可以写成:$x^n=(x^{k}-sum_{i=0}^{k-1} a_0*x^{k-1-i})*g(x)+r(x)$

    可以得到:

    $A^n=r(A)$

    设$r(A)=sum_{i=0}^{k-2} bi*A^{k-2-i}$

    同时乘上初始矩阵$B$

    $B*A^n=sum_{i=0}^{k-2} bi*B*A^{k-2-i}$

    关注后面的:$B*A^{k-2-i}$

    两种处理方法:

    $B*A^{k-2-i}$的最大下标的元素就是$F_{2*k-2-i}$,

    我们需要提前推出$F_k o F_{2*k-2}$然后每一个依次乘上对应的系数$b_i$即可(n要提前-=k)

    或者,$B*A^{k-2-i}$的最小下标的元素就是$F_{k-2-i}$,然后每一个依次乘上对应的系数$b_i$即可(n就不用动了)

    至于$r(x)$的求法

    1.暴力多项式除法(n太大和暴力没有区别)

    2.倍增+暴力多项式取mod

    ​ 计算$x=T space mod space A$自乘得到:$x^2=T^2 space mod space A$,再暴力取模(由于A的首项是1,所以不用逆元O(k^2)即可)

    类似快速幂一样乘到答案多项式里去

    O(k^2logn)

    3.暴力取模变成多项式除法O(klognlogk)

     

     

    例题:

    【BZOJ4161】

    NOI2017]泳池——概率DP+线性递推

  • 相关阅读:
    11.26 JDBC
    11.25 sql
    Tomcat catalina.out太大解决
    js小数运算出现多位小数如何解决
    idea在调试时出现Method breakpoints may dramatically slow down debugging, idea卡很久
    MAC 'readonly' option is set (add ! to override)错误解决
    idea 2018注册码(激活码)永久性的
    切面保存web访问记录
    高德地图web 端智能围栏
    spring boot 入门 使用spring.profiles.active来分区配置
  • 原文地址:https://www.cnblogs.com/Miracevin/p/10222575.html
Copyright © 2011-2022 走看看