【算法】矩阵快速幂例题一道

对于f(n)=x^n+\frac{1}{x^n},存在关系f(n)+f(n-2)=f(n-1)*f(1),即f(n)=k \cdot f(n-1)-f(n-2),也就得到了递推关系式,根据该关系式可求解得base矩阵:

\begin{bmatrix} k &1 \\ -1& 0 \end{bmatrix}

对于斐波那契数列,求解f(n)只要将base矩阵 \begin{bmatrix} 1 &1 \\ 1& 0 \end{bmatrix} 累乘n-1次即可,因为它初始时的矩阵\begin{bmatrix} f(2) &f(1) \\ f(1)& f(0) \end{bmatrix}  恰好与base矩阵相同,而本题中 \begin{bmatrix} f(2) &f(1) \\ f(1)& f(0) \end{bmatrix}=\begin{bmatrix} k^2-2 &k \\ k& 2 \end{bmatrix} ,所以需要特别的初始化。

Python代码如下:

T=int(input())
MOD=int(1e9+7)
#print(type(MOD))

# 矩阵乘法
def matmul(m1,m2):
    res=[[0]*len(m2[0]) for _ in range(len(m1))]
    for y in range(len(m1)):
        for x in range(len(m2[0])):
            n=0
            for a,b in zip(m1[y],(line[x] for line in m2)):
                n+=a*b
            res[y][x]=n#% MOD
    return res

# 快速幂
def fab(n,k):
    if n<0:
        return 0
    m=[
        [k,-1],
        [1,0]
    ]
    res=[ # 初始化不能是单位矩阵E,因为这题里f(2)f(1)f(0)不像斐波那契数量那样,正好和需要累乘的base矩阵相同,需要先初始化为实际的f(2)f(1)f(0)
        [k**2-2,k],
        [k,2]
    ]
    while n!=0:
        if n&1==1:
            res=matmul(m,res)
        m=matmul(m,m)
        n>>=1
    a,b=res[0]
    return a%MOD

for _ in range(T):
    n,k=map(int,input().split())
    if n==0:
        print(2)
    elif n==1:
        print(k)
    else:
        print(fab(n-2,k))

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值