讲快速幂的时候就提到矩阵快速幂了啊,知道是个好东西,但是因为当时太蒟(现在依然)没听懂。现在把它补上。

一、矩阵快速幂

首先我们来说说矩阵。在计算机中,矩阵通常都是用二维数组来存的。矩阵加减法比较简单易懂,两个矩阵相加减就是两个行列数均相等的矩阵的对应位置的数相加减

矩阵乘法就有些复杂了。它有一些特殊的要求,要求参与矩阵乘法运算的第一个矩阵的列数等于第二个矩阵的行数。所得的矩阵列数为第一个矩阵的列数,行数为第二个矩阵的行数。

举个栗子。

另外矩阵乘法有一些性质。满足结合律与分配律,不满足交换律(这很好理解)。

这是矩阵。

快速幂就比较显然了,我们先来复习一下快速幂的代码。

 long long poww(long long a,long long b)
{
long long ans=;
while(b>)
{
if(b&) ans=ans*a%k;
b>>=;
a=a*a%k; }
return ans; }

那么矩阵快速幂就不难理解了。设指数为k,我们可以用一个ans矩阵来代表最后结果,运行ksm函数。

ans的初值在ij相等时应为1.

个人习惯用结构体+二维数组存储矩阵。

(这里应该有代码)

至于模数,我们可以理性愉悦地运用膜的性质。

二、优化线性数列

这里省掉奇幻的引入用斐波那契栗子 喵~

我们直接看方法。

我们第一步需要构造基准矩阵,这也是最难的地方,想了好久才大概总结出一个方法。(还可能不对呢)

我们拿斐波那契数列来开刀:

f[i]=f[i-]+f[i-]

对于f[i],找到最深需要追溯到的之前的值。在这里是f[i-2]。于是我们可以得到初始矩阵

-----------
| f[i-] |
| |
| f[i-] |
| |
|---------|

目标矩阵

------------
| f[i] |
| |
| |
| f[i-] |
| |
-------------

(这里比较玄学 感性理解qwq)

-----------
| f[i-1] |
| |
| f[i-2] |
-----------
   |
   |
   |
------------
| f[i] |
| |
| |
| f[i-1] |
| |
-------------

我们知道

f[i]=*f[i-]+*f[i-]
f[i-]=*f[i-]+*f[i-]

于是取出他们的系数,得到


这里贴出LuoguP1939的代码

 #include<cstdio>
#include<algorithm>
#include<cstring> using namespace std;
typedef long long ll;
const ll moder=1e9+; int T;
ll n;
struct matrix{
ll m[][];
}ans,sta; void init()
{
memset(ans.m,,sizeof(ans.m));
for(int i=;i<=;i++) ans.m[i][i]=;
memset(sta.m,,sizeof(sta.m));
sta.m[][]=sta.m[][]=sta.m[][]=sta.m[][]=;
} matrix mul(matrix a,matrix b)
{
matrix tmp;
memset(tmp.m,,sizeof(tmp.m));
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
(tmp.m[i][j]+=(a.m[i][k]%moder)*(b.m[k][j]%moder))%=moder;
return tmp;
} void ksm(ll p)
{
while(p)
{
if(p&) ans=mul(ans,sta);
p>>=;
sta=mul(sta,sta);
}
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
if(n<=){printf("1\n");continue;}
init();
ksm(n);
printf("%lld\n",ans.m[][]);
}
return ;
}

未完待续

矩阵快速幂/矩阵加速线性数列 By cellur925的更多相关文章

  1. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

  2. POJ 3734 Blocks(矩阵快速幂+矩阵递推式)

    题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数. 该题我们可以想到一个递推式 .   设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数 ...

  3. POJ3233 Matrix Power Series 矩阵快速幂 矩阵中的矩阵

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 27277   Accepted:  ...

  4. hdu 4965 矩阵快速幂 矩阵相乘性质

    Fast Matrix Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Jav ...

  5. hihocoder第42周 3*N骨牌覆盖(状态dp+矩阵快速幂)

    http://hihocoder.com/contest/hiho42/problem/1 给定一个n,问我们3*n的矩阵有多少种覆盖的方法 第41周做的骨牌覆盖是2*n的,状态转移方程是dp[i] ...

  6. 矩阵快速幂---BestCoder Round#8 1002

    当要求递推数列的第n项且n很大时,怎么快速求得第n项呢?可以用矩阵快速幂来加速计算.我们可以用矩阵来表示数列递推公式比如fibonacci数列 可以表示为 [f(n)   f(n-1)] = [f(n ...

  7. uva11551矩阵快速幂

    题目看了半天没看懂,,就是把一个数列更新r次,每次更新就是计算和,就是每一个数,只要出现了的表号都要加上去,具体看代码 矩阵快速幂实现加速 #include<map> #include&l ...

  8. 解题报告:poj 3070 - 矩阵快速幂简单应用

    2017-09-13 19:22:01 writer:pprp 题意很简单,就是通过矩阵快速幂进行运算,得到斐波那契数列靠后的位数 . 这是原理,实现部分就是矩阵的快速幂,也就是二分来做 矩阵快速幂可 ...

  9. HDU5950 Recursive sequence 非线性递推式 矩阵快速幂

    题目传送门 题目描述:给出一个数列的第一项和第二项,计算第n项. 递推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由于n很大,所以肯定是矩阵快速幂的题目,但是矩阵快速幂只能解决线性的问题 ...

随机推荐

  1. MySql基本数据类型(转)

    说明:通俗的理解:1字节的8位,即1byte=8bit,而这个1byte叫做长度范围,范围的算法是使用bit去求,比如8bit的长度范围是2的8次方,但是在数据库中的类型上是有区分有符号和无符号的,默 ...

  2. eclipse需要的环境变量就两个,一个是java_home指向JDK。另一个是Tomcat,自己去preference-sever下new一个

    1.eclipse需要的环境变量就两个,一个是java_home指向JDK.另一个是Tomcat,自己去preference-sever下new一个

  3. Centos5设置静态IP地址

    1.设置静态IP地址,修改/etc/sysconfig/network-scripts/ifcfg-eth0的内容: DEVICE=eth0 #网卡对应的设备别名 BOOTPROTO=static # ...

  4. 学习Centos 7的笔记

    Step-1 yum install epel-release && yum clean all && yum update –y &&  yum -y ...

  5. jason数据格式 -- 扫盲

    JSON是 JavaScript Object Notation的简称,是一种轻量的数据表示方法.jason格式採用key:value的方式记录数据,非常直观,比XML简洁,因而大受欢迎 介绍jaso ...

  6. Robot Framework操作

    Robot Framework 介绍 RobotFramework是一款基于python的开源自动化测试框架,遵守Apache License 2.0协议,在此协议下所有人都可以免费开发和使用.因为R ...

  7. 单片机远程控制步进电机、LED灯和蜂鸣器

    通过採用C#语言实现的上位机控制单片机的步进电机模块.LED灯和蜂鸣器模块,使步进电机进行正.反转和停止并控制转速:LED灯模块进行有选择的呼吸式表达:蜂鸣器模块的開始和终止. 上位机通过串口和自己定 ...

  8. Servlet学习总结,为理解SpringMVC底层做准备

    Servlet 一句话概括 :处理web浏览器,其他HTTP客户端与服务器上数据库或其他应用交互的中间层 Servlet 生命周期 : 1.类加载, 2.实例化并调用init()方法初始化该 Serv ...

  9. Apache Karaf配置远程调试

    软件环境 apache-karaf-4.0.0 配置方法: 在 bin/karaf.bat 文件里,顶部增加 set KARAF_DEBUG=true 然后.重新启动karaf 启动之后.就可以看到例 ...

  10. 云Hbase数据库在亿方云实践之路

    本文主要先介绍了亿方云,进而谈及了数据架构,着重分析了HBase实践等 2017云栖大会HBase专场,亿方云科技CTO 王成军带来HBase在亿方云客户端同步系统中的应用实践的演讲.本文主要先介绍了 ...