首页 > 其他分享 >矩阵乘法 - 斐波那契前 n 项和

矩阵乘法 - 斐波那契前 n 项和

时间:2023-11-27 23:55:04浏览次数:28  
标签:right temp int List 矩阵 斐波 range 契前 乘法

题目

题目描述

求数列 \(f_n=f_{n-2}+f_{n-1}\) 的前 \(n\) 项的和,其中 \(f_1=1,f_2=1\)。
输出的数 \(\bmod\ 10^9+7\)

样例

样例输入

10

样例输出

143

数据范围

对于 \(20\%\) 的数据,有 \(1\leq n\leq 20\)

对于 \(100\%\) 的数据,有 \(1≤n<2^{63}\)

分析

这道题目矩阵乘法的经典应用,矩阵乘法经常与快速幂结合在一起,难点在于将矩阵的前n项构造出来,因为这道题目需要求解的是前n项的和,所以可以将前n项和s放入到矩阵中,这样可以在矩阵乘法中计算出s。令

\(F_{n} = \left [ F_{n} , F_{n+1} , S_{n} \right ]\)

\(F_{n+1} = \left [ F_{n+1} , F_{n+2} , S_{n+1} \right ]\)

可以构造出对应的矩阵A,可以根据下面的式子计算矩阵乘法。

$\left [ F_{n} , F_{n+1} , S_{n} \right ] \cdot \begin{bmatrix} 0 & 1 & 0 \ 1 & 1 & 1 \ 0 & 0 & 1\end{bmatrix} = \left [ F_{n+1} , F_{n+2} , S_{n+1} \right ] \left ( F_{n}\cdot A = F_{n+1} \right ) $

$\to A = \begin{bmatrix} 0 & 1 & 0 \ 1 & 1 & 1 \ 0 & 0 & 1\end{bmatrix} , F_{n} = F_{1} \cdot A_{n-1} , F_{1} = \left [ 1 , 1 , 1 \right ] , res = F_{n}\left [ 2 \right ] $

code

from typing import List
 
 
class Solution:
    # 矩阵乘法满足结合律所以可以使用快速幂来解决
    # res = res * a
    def mul(self, n: int, mod: int, a: List[int], b: List[List[int]]):
        temp = [0] * n
        for i in range(n):
            for j in range(n):
                temp[i] = (temp[i] + a[j] * b[j][i]) % mod
        # 将结果复制到原来的a中, a其实是f1
        for i in range(n):
            a[i] = temp[i]
 
    # a = a * a
    def mul2(self, n: int, mod: int, a: List[List[int]], b: List[List[int]]):
        temp = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
        for i in range(n):
            for j in range(n):
                for k in range(n):
                    temp[i][j] = (temp[i][j] + a[i][k] * b[k][j]) % mod
        for i in range(n):
            for j in range(n):
                a[i][j] = temp[i][j]
 
    def process(self):
        n, m = map(int, input().split())
        # 将前n项和存储到矩阵中, f1的第三个元素存储的是前n项的和
        f1 = [1, 1, 1]
        a = [[0, 1, 0], [1, 1, 1], [0, 0, 1]]
        # 因为是从A1开始的所以计算的其实是A ^ (n - 1)
        n -= 1
        while n > 0:
            # res = res * a
            if n & 1:
                self.mul(3, m, f1, a)
            self.mul2(3, m, a, a)
            n >>= 1
        return f1[2]
 
 
if __name__ == '__main__':
    print(Solution().process())

标签:right,temp,int,List,矩阵,斐波,range,契前,乘法
From: https://www.cnblogs.com/Zhao-zzZ/p/17860885.html

相关文章

  • 秦疆的Java课程笔记:41 流程控制 打印九九乘法表
    打印九九乘法表:1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*......
  • 汇编-MUL和IMUL乘法
    32位模式下整数乘法可以实现32、16或8位的操作,64位下还可以使用64位操作数。MUL执行无符号乘法,IMUL执行有符号乘法MUL:无符号数乘法32位模式下,MUL(无符号数乘法)指令有三种类型:执行8位操作数与AL寄存器的乘法;执行16位操作数与AX寄存器的乘法;执行32位操作数与EAX寄......
  • R语言集成模型:提升树boosting、随机森林、约束最小二乘法加权平均模型融合分析时间序
    原文链接:http://tecdat.cn/?p=24148原文出处:拓端数据部落公众号 最近我们被要求撰写关于集成模型的研究报告,包括一些图形和统计输出。特别是在经济学/计量经济学中,建模者不相信他们的模型能反映现实。比如:收益率曲线并不遵循三因素的Nelson-Siegel模型,股票与其相关因素之间的......
  • C#通过循环绘制九九乘法表以及杨辉三角形
    九九乘法表 定义两个变量intx,y;for(x=1;x<=9;x++)//循环列{for(y=1;y<=x;y++)//循环行{Console.Write("{1}*{0}={2}",x,y,x*y);//显示出每一个式子}Console.WriteLine();//在每一行换行}杨辉三角形......
  • 打印九九乘法表
    publicclassjiujiu{publicstaticvoidmain(String[]args){//打印行数for(inti=1;i<=9;i++){//打印列数(行数等于列数)for(intj=1;j<=i;j++){System.out.print(j+"*"+i+"="+......
  • 代码训练营第三十八天(Python)| 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
    509.斐波那契数1、动态规划classSolution:deffib(self,n:int)->int:ifn<=1:returnn#dp[i]代表第i个数的斐波那契值dp=[0]*(n+1)dp[0]=0dp[1]=1foriinrange(2,n+1):......
  • Go语言打印九九乘法表,这是整洁代码范例
    Go语言打印九九乘法表,这是整洁代码范例/Go语言输出九九乘法表/九九乘法表是我们学习编程时的一项基本练习,它看似简单,通过实现输出九九乘法表可以加深对Go语言循环结构的理解和运用。本文将使用Go语言输出九九乘法表,内容涵盖:问题描述基本思路使用双层for循环......
  • 矩阵乘法
    一个神奇的东西矩阵乘法重载符实现代码:nodeoperator*(constnode&a)const{nodesum(0);for(inti=1;i<=n;i++)for(intj=1;j<=n;j++)for(intk=1;k<=n;k++)sum.g[i][j]+=g[i][k]*a.g[k][j];r......
  • 打印九九乘法表
    #include<stdio.h>int{   int   for   {       for       {           printf("%d*%d=%2d",i,j,i*j);       }       n++;       if       printf("\n");   }   return}......
  • MATLAB热传导方程模型最小二乘法模型、线性规划对集成电路板炉温优化
    原文链接:https://tecdat.cn/?p=34230原文出处:拓端数据部落公众号分析师:LuoyanZhang集成电路板等电子产品生产中,控制回焊炉各部分保持工艺要求的温度对产品质量至关重要。通过分析炉温曲线,可以检查和改善产品生产质量,提高产量和解决生产问题。高效温度曲线测试系统的必要组件包......