A矩阵分解示例

  1. def mm_yu(x,y,mod):
  2. a =[[0,0],[0,0]]
  3. for i in range(2):
  4. for j in range(2):
  5. for k in range(2):
  6. a[i][j] += (x[i][k] * y[k][j])%mod
  7. return a
  8. def quick_mm_yu(M,N,mod):
  9. E = [[1,0],[0,1]]
  10. while N:
  11. if N%2 !=0:
  12. E = mm_yu(E,M,mod)
  13. M = mm_yu(M,M,mod)
  14. N >>=1
  15. return E
  16. def fibonacci_yu(M,n,mod):
  17. f = [[1,0],[1,0]]
  18. return mm_yu(quick_mm_yu(M,n-2,mod),f,mod)[0][0]%mod
  19. def mm(x,y):
  20. a =[[0,0],[0,0]]
  21. for i in range(2):
  22. for j in range(2):
  23. for k in range(2):
  24. a[i][j] += x[i][k] * y[k][j]
  25. return a
  26. def quick_mm(M,N):
  27. E = [[1,0],[0,1]]
  28. while N:
  29. if N%2 !=0:
  30. E = mm(E,M)
  31. M = mm(M,M)
  32. N >>=1
  33. return E
  34. def fibonacci(M,n):
  35. f = [[1,0],[1,0]]
  36. return mm(quick_mm(M,n-2),f)[0][0]
  37. n,m,p = map(int,input().split())
  38. M = [[1,1],[1,0]]
  39. if m>n+2 :
  40. print(fibonacci_yu(M,n+2,p)%p-1)
  41. else:
  42. mod = fibonacci(M,m)
  43. print(fibonacci_yu(M,n+2,mod)%mod%p-1)

参考:
https://blog.dotcpp.com/a/99877
https://blog.csdn.net/flyfish1986/article/details/48014523

点赞(0)
 

9.9 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论