解题思路:
注意事项:
参考代码:
while True:
try:
n,m,p = map(int,input().split())
M = [[1,1],[1,0]]
def mulMatrix(x, y,mod): # 定义二阶矩阵相乘的函数
ans = [[0 for i in range(2)] for j in range(2)]
for i in range(2):
for j in range(2):
for k in range(2):
ans[i][j] += (x[i][k] * y[k][j])%mod
return ans
def quickMatrix(M, N,mod): #矩阵快速幂
E = [[1,0],[0,1]] # 先定义一个单位矩阵
while (N):
if N % 2 != 0:
E = mulMatrix(E,M,mod)
M = mulMatrix(M,M,mod)
N >>= 1
return E
def fib(M,q,mod): #返回第q个斐波那契数
s = [[1,1],[0,0]]
res = mulMatrix(s,quickMatrix(M,q-2,mod),mod)[0][0]%mod
return res
def mulMatrix_1(x, y): # 定义二阶矩阵相乘的函数
ans = [[0 for i in range(2)] for j in range(2)]
for i in range(2):
for j in range(2):
for k in range(2):
ans[i][j] += x[i][k] * y[k][j]
return ans
def quickMatrix_1(M, N): #矩阵快速幂
E = [[1,0],[0,1]] # 先定义一个单位矩阵
while (N):
if N % 2 != 0:
E = mulMatrix_1(E,M)
M = mulMatrix_1(M,M)
N >>= 1
return E
def fib_1(M,q): #返回第q个斐波那契数
s = [[1,1],[0,0]]
res = mulMatrix_1(s,quickMatrix_1(M,q-2))[0][0]
return res
if m >= n+2:
print(fib(M,n+2,p)%p-1)
else:
mod = fib_1(M,m)
print(fib(M,n+2,mod)%fib_1(M,m)%p-1)
except:
break
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复