zoukankan      html  css  js  c++  java
  • 特征根法求通项+广义Fibonacci数列找循环节

    Best Solver

    Problem's Link


     

    Mean: 

    给出x和M,求:(5+2√6)^(1+2x)的值。x<2^32,M<=46337.

    analyse:

    这题需要用到高中的数学知识点:特征根法求递推数列通项公式。

    方法是这样的:

    对于这题的解法:

    记λ1=5+2√6,λ2=5-2√6,则λ1λ2=1,λ1+λ2=10

    根据韦达定理可以推导出:λ1,λ2的特征方程为 x^2-10x+1=0

    根据λ1=5+2√6,λ2=5-2√6是特征方程x^2-10x+1=0的解,可以求出:b=-10,c=1

    再使用该特征方程反向推导出递推公式为:a[n]=10*a[n-1]-a[n-2]

    再由特征根法确定通项为:a[n]=(5+2√6)^n+(5-2√6)^n

    观察通项,发现(5-2√6)^n<1,(5+2√6)^n>1。并且可以确定(5+2√6)^n的整数部分的值为a[n]-1

    到这里,可以利用线性递推公式a[n]=10*a[n-1]-a[n-2],构造矩阵来找循环节。

    为什么要找循环节呢?

    因为n=2^x相当大,而模数M<=46337,对于每一个模数M,都存在循环节,这样的话我们就不需要完整的计算n次幂运算了。

    而且我们发现这些循环节都比较小,所以我们可以直接暴力求矩阵循环节。

    Time complexity: O(N+logx)

     

    view code

     

  • 相关阅读:
    mysql基础
    协程
    锁与队列
    线程练习
    线程
    并发编程
    进程
    操作系统发展史
    第六周----例行报告
    附加题找bug
  • 原文地址:https://www.cnblogs.com/crazyacking/p/4826558.html
Copyright © 2011-2022 走看看