对于,存在关系,即,也就得到了递推关系式,根据该关系式可求解得base矩阵:
对于斐波那契数列,求解只要将base矩阵 累乘次即可,因为它初始时的矩阵 恰好与base矩阵相同,而本题中 ,所以需要特别的初始化。
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))