矩阵快速幂

矩阵快速幂以及dp矩阵优化 今天我来说说矩阵快速幂以及dp矩阵优化,我先来讲矩阵快速幂。 阅读详情


说道矩阵快速幂先要了解什么是矩阵什么是矩阵乘法、这更有利于我们理解矩阵快速幂

矩阵快速幂可以把一个 O(n)的效率提高 变成O(log(n))的效率其关键核心在于矩阵乘法的特征

比如A*A*A*A  =>  (A*A)*(A*A)  很简单的就可以想到 B = A*A    原来的式子就会等去  B*B

这样一来我们可以先计算出 B 然后计算出B*B 答案就出来了 效率明显降低

接下来以POJ一道简单的题目为例 、并贴上我的代码

题目连接: http://poj.org/problem?id=3070

Fibonacci
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 9978 Accepted: 7118

Description

In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

An alternative formula for the Fibonacci sequence is

.

Given an integer n, your goal is to compute the last 4 digits of Fn.

Input

The input test file will contain multiple test cases. Each test case consists of a single line containing n (where 0 ≤ n ≤ 1,000,000,000). The end-of-file is denoted by a single line containing the number −1.

Output

For each test case, print the last four digits of Fn. If the last four digits of Fn are all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., print Fn mod 10000).

Sample Input

0
9
999999999
1000000000
-1

Sample Output

0
34
626
6875

Hint

As a reminder, matrix multiplication is associative, and the product of two 2 × 2 matrices is given by

.

Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:

.

个人认为矩阵快速幂的代码在理解之后写起来会非常容易 , 关键是求新矩阵的过程 (三个for),以及快速求值的方法(用到 & 和 >>这两个运算符)

以下是我的AC代码

#include<iostream>
#define MOD 10000
using namespace std;

int a[2][2] ={1};
struct matrix
{
     long long m[2][2];
};

matrix mul(matrix a , matrix b)
{
     matrix res = {0,0,0,0};
     for(int i = 0 ; i < 2 ; i++)
     {
          for(int j = 0 ; j < 2 ; j++)
          {
               for(int k = 0 ; k < 2 ; k++)
                    res.m[i][j] = (res.m[i][j] + a.m[i][k] * b.m[k][j]) % MOD;
          }
     }
     return res;
}
int main()
{
     int n;
     while(cin>>n && n != -1)
     {
          matrix ans ={1,1,1,0}, s = ans;
          while(n)
          {
               if(n&1)
                    ans = mul(ans,s);
               n >>= 1;
               s = mul(s,s);
          }
          cout << ans.m[1][1] << endl;
     }
     return 0;
}

矩阵的题目难点在于如何构造一个矩阵

下面附上一个3行3列的矩阵乘法模板 大家通过调试理解一下矩阵快速幂


#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <iostream>
using namespace std;


int N;


struct matrix
{
       int a[3][3];
}origin,res;




matrix multiply(matrix x,matrix y)
{
       matrix temp;
       memset(temp.a,0,sizeof(temp.a));
       for(int i=0;i<3;i++)
       {
               for(int j=0;j<3;j++)
               {
                       for(int k=0;k<3;k++)
                       {
                               temp.a[i][j]+=x.a[i][k]*y.a[k][j];
                       }
               }
       }
       return temp;
}


void init()
{
     printf("随机数组如下:\n");
     for(int i=0;i<3;i++)
     {
             for(int j=0;j<3;j++)
             {
                     origin.a[i][j]=rand()%10;
                     printf("%8d",origin.a[i][j]);
             }
             printf("\n");
     }
     printf("\n");
     memset(res.a,0,sizeof(res.a));
     res.a[0][0]=res.a[1][1]=res.a[2][2]=1;                  //将res.a初始化为单位矩阵
}


void calc(int n)
{
     while(n)
     {
             if(n&1)
                    res = multiply(res,origin);
             n>>= 1;
             origin=multiply(origin,origin);
     }
     printf("%d次幂结果如下:\n",n);
     for(int i=0;i<3;i++)
     {
             for(int j=0;j<3;j++)
                     printf("%8d",res.a[i][j]);
             printf("\n");
     }
     printf("\n");
}
int main()
{
    while(cin>>N)
    {
            init();
            calc(N);
    }
    return 0;
}



海康威视4G摄像头直连实战:不用萤石云,手把手教你用ISUP SDK搞定跨网段视频流 本文详细介绍了如何通过海康威视ISUP SDK实现4G摄像头的直连通信,提供了一套零平台费、自主可控的技术方案。文章涵盖技术选型、设备端配置、服务器端开发及高级应用场景,特别适合中小型安防项目,帮助开发者解决跨网段视频流传输难题,降低长期运营成本。 阅读详情

相关推荐

AI协议助手:法律文本解析与智能问答技术解析

自然语言处理(NLP)技术在法律文本解析中展现出巨大潜力,通过BERT等预训练模型实现条款分类与语义理解。结合OCR与知识图谱技术,AI协议助手能快速提取合同核心条款,并以问答形式解释法律术语,显著提升商务场景的决策效率。测试数据显示,该系统对NDA协议的识别准确率达92%,响应时间仅1.2秒,特别适用于人力资源竞业协议、云服务SLA评估等场景。随着RAG架构与法律术语向量库的应用,AI+法律正推动合同审核成本下降67%,未来将在跨境合规、智能谈判等方向持续演进。

weixin_29053577的博客 128

快速幂 矩阵快速幂

前言:好像没啥好写的,链接可能还没有更新完 快速幂 快速幂,用于解决当n很大时的情况。通常与取模同时应用。 用最笨的方法求,即。时间复杂度为,而快速幂(附带取模),可以将时间复杂度降低为。 利用倍增的思想,例如,等于,又等于,即,如果n为奇数,,那么换成代码就是: ll Powermod(ll a,ll b) { ll ans=1; a=a%mod; while(b>0) { if(b%2==1) ans=(ans*a)%...

issey的博客 8275

2026年ERP选型实战:按规模分档,避开成本与实施陷阱

企业资源计划(ERP)是现代企业数字化转型的核心系统,它将财务、供应链、制造、人力等业务整合到统一平台。随着云计算和人工智能技术的发展,ERP已从传统本地部署的记录工具演变为SaaS订阅制、具备AI辅助决策能力的智能运营平台。不同规模企业在选型时的关注点差异巨大:小微企业追求轻量化和快速出报表,中型企业需要在流程标准化与业务灵活性间取得平衡,大型集团则注重多法人管控和数据治理。此外,制造、电商、工程等行业对ERP的模块要求也各有侧重,成本核算数据跑不通更是普遍痛点。如何结合企业规模与行业特征,制定合理的选型

weixin_34320724的博客 378

矩阵快速幂算法

矩阵快速幂算法、利用矩阵快速幂计算斐波那契数列 矩阵快速幂的本质就是 矩阵+快速幂,思路没什么变化。 快速幂的思路见之前的 快速幂介绍,这里就不多说了。 至于矩阵的话,知道矩阵是啥,怎么算乘法就可以了。 相关矩阵基础 注:已经了解矩阵的可以跳过本部分内容。 简单来说 n∗mn*mn∗m 的矩阵就是个 nnn 行 mmm 列 的大方块。 矩阵要进行乘法运算必须保证第一个矩阵的列数=第二个矩阵的行数。

果光的博客 4487

cmu15445(2024fall) project 2

project 2比p1难度要更大,代码量更大且涉及的知识更多,实现中出现的bug更多,好在是最后全部解决了。我最大的收获在于对于多线程编程的理解更深入了,实际发现解决了多个多线程相关的bug,学会了更多多线程下debug的技巧方法,也见识了更多多线程的bug情况。在之后可以更系统的学习一下多线程编程。同时学会实现B+树也是需要掌握的基础。

Jerome_Yi的博客 1559

11、硬件工程师笔试面试——IGBT(2025版本)

IGBT的应用展望与创新趋势表明,随着电子技术的不断发展,IGBT在各个领域都有广泛的应用,如高压电力系统、交通工具、电锅炉、太阳能和风能发电系统等。FS型IGBT(场终止型绝缘栅双极晶体管)在电力传输领域的应用中,通过其独特的设计和特性,有助于确保系统的稳定性和安全性。每种器件都有其独特的优势,能够满足电力传输系统中不同的技术要求。FS型IGBT通常具有正温度系数,这意味着随着温度的升高,导通压降的主要影响因素是载流子迁移率的降低以及集电极和发射极的接触电阻的增加,有助于在高温下维持稳定的性能。

XU157303764的博客 2672

快速幂和矩阵快速幂

前言 新年第一篇技术类的文章,应该算是算法方面的文章的。看标题:快速幂和矩阵快速幂,好像挺高大上。其实并不是很难,快速幂就是快速求一个数的幂(一个数的 n 次方)。 快速幂 首先,来看一下幂,我们知道,假设有一个整数 x, 如果我们要求出 x^n (即为 x 的 n 次方)的值,最容易想到的办法就是循环相乘(这里不考虑整数溢出的情况下),于是我们很容易就可以写出下面的代码: ...

指点 4678

【ROS】Nav2源码之nav2_collision_monitor(碰撞监测)详解

nav2_collision_monitor碰撞监视器是一个节点,为机器人提供了一个额外的安全级别。它使用来自传感器的数据,执行若干与避免碰撞相关的任务,绕过成本图和轨迹规划器,监测是否需要紧急停止或者减速。

郭老二 1455

快速幂,矩阵快速幂

分清一维k阶和k维一阶下面这个是k维一阶,依赖同级别好几个维度,但是只依赖一个同级别k维一阶是每个对应每一列竖着的3.矩阵的幂不同,一维k阶是n-(k-1)的幂,k维1阶是n-1次幂注意:vector一定要用传引用作为参数,否则会很慢!!!

2401_87050480的博客 1747

RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGB

RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGB

J。 2339

华为OD机试双机位C卷-停车场收入统计 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷 停车场收入统计,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 停车场收入统计。

qq_45776114的博客 2185

矩阵快速幂总结

基础知识:(会基础的直接看应用部分)(1)矩阵乘法简单的说矩阵就是二维数组,数存在里面,矩阵乘法的规则:A*B=C其中c[i][j]为A的第i行与B的第j列对应乘积的和,即:代码:const int N=100; int c[N][N]; void multi(int a[][N],int b[][N],int n)//n是矩阵大小,n&lt;N { memset(c,0,sizeof c...

努力 4万+

matlab 计算InSAR干涉相位图的残差点

在理想的情况下,相位场是连续的,图像内沿着任何一条封闭曲线的积分应该为零。这样的连续场称为无旋场,反之为有旋场。但在实际测量过程中,由于噪声、欠采样和系统误差等因素的影响,得到的 InSAR 干涉相位条纹图中往往会出现不连续的相位点,即残差点

点云侠的博客 266

快速幂与矩阵快速幂

快速幂与矩阵快速幂

Mr_huoge的博客 744

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

矩阵及矩阵快速幂

矩阵是一个由实数组成的长方形集合。行数和列数相等的矩阵叫做方阵。下面就是一个方阵。

gaomuchen_120309的博客 2034

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

从快速幂到矩阵快速幂入门

个人博客链接: 从快速幂到矩阵快速幂入门 快速幂 假设大家已经快忘记了快速幂这个东西 一般对于aba^bab我们只需要连续乘bbb次aaa就能得到答案了: 例如 232^323只需要连续乘333次222即可,23=2∗2∗22^3=2*2*223=2∗2∗2 2132^{13}213只需要连续乘131313次222即可,213=2∗2∗2∗2∗2∗2∗2∗2∗2∗2∗2∗2∗22^{1...

nuoyanli的博客 1686

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

快速幂、矩阵快速幂

斐波那契数列差不多是最简单的矩阵快速幂的应用,矩阵快速幂的难点在于如何构建一个矩阵,使其能够满足递推式。

chp的博客 564

矩阵快速幂模板

前置知识 矩阵 矩阵是一个n×mn \times mn×m的阵列,下面是一个3×33\times 33×3的矩阵: [100010001]\begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&1\\ \end{bmatrix}⎣⎡​100​010​001​⎦⎤​ 矩阵乘法 若矩阵A的大小为n×mn\times mn×m ,另一矩阵B的大小为m×pm\times pm×p,则两个矩阵可以做乘法,得到的矩阵C大小为n∗pn*pn∗p。具体的乘法规

陈颜的博客 1319

快速幂&矩阵快速幂入门

快速幂,矩阵快速幂

wait 1022
上一篇: Codeforces Round #290 (Div. 2)
下一篇: Codeforces Round #292 (Div. 2) Problem C - Drazil and Factorial
Anjone_
博客等级 码龄12年 2粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值