矩阵快速幂/矩阵加速线性数列 By cellur925
讲快速幂的时候就提到矩阵快速幂了啊,知道是个好东西,但是因为当时太蒟(现在依然)没听懂。现在把它补上。
一、矩阵快速幂
首先我们来说说矩阵。在计算机中,矩阵通常都是用二维数组来存的。矩阵加减法比较简单易懂,两个矩阵相加减就是两个行列数均相等的矩阵的对应位置的数相加减。
矩阵乘法就有些复杂了。它有一些特殊的要求,要求参与矩阵乘法运算的第一个矩阵的列数等于第二个矩阵的行数。所得的矩阵列数为第一个矩阵的列数,行数为第二个矩阵的行数。
举个栗子。

另外矩阵乘法有一些性质。满足结合律与分配律,不满足交换律(这很好理解)。
这是矩阵。
快速幂就比较显然了,我们先来复习一下快速幂的代码。
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的更多相关文章
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- POJ 3734 Blocks(矩阵快速幂+矩阵递推式)
题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数. 该题我们可以想到一个递推式 . 设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数 ...
- POJ3233 Matrix Power Series 矩阵快速幂 矩阵中的矩阵
Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 27277 Accepted: ...
- hdu 4965 矩阵快速幂 矩阵相乘性质
Fast Matrix Calculation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Jav ...
- hihocoder第42周 3*N骨牌覆盖(状态dp+矩阵快速幂)
http://hihocoder.com/contest/hiho42/problem/1 给定一个n,问我们3*n的矩阵有多少种覆盖的方法 第41周做的骨牌覆盖是2*n的,状态转移方程是dp[i] ...
- 矩阵快速幂---BestCoder Round#8 1002
当要求递推数列的第n项且n很大时,怎么快速求得第n项呢?可以用矩阵快速幂来加速计算.我们可以用矩阵来表示数列递推公式比如fibonacci数列 可以表示为 [f(n) f(n-1)] = [f(n ...
- uva11551矩阵快速幂
题目看了半天没看懂,,就是把一个数列更新r次,每次更新就是计算和,就是每一个数,只要出现了的表号都要加上去,具体看代码 矩阵快速幂实现加速 #include<map> #include&l ...
- 解题报告:poj 3070 - 矩阵快速幂简单应用
2017-09-13 19:22:01 writer:pprp 题意很简单,就是通过矩阵快速幂进行运算,得到斐波那契数列靠后的位数 . 这是原理,实现部分就是矩阵的快速幂,也就是二分来做 矩阵快速幂可 ...
- HDU5950 Recursive sequence 非线性递推式 矩阵快速幂
题目传送门 题目描述:给出一个数列的第一项和第二项,计算第n项. 递推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由于n很大,所以肯定是矩阵快速幂的题目,但是矩阵快速幂只能解决线性的问题 ...
随机推荐
- Java的对象和类
以下内容引用自http://wiki.jikexueyuan.com/project/java/object-classes.html: 一.概述 Java是一种面向对象的语言.作为一种具有面向对象特 ...
- C#:excel导入导出
资源:excelService 服务 http://download.csdn.net/detail/istend/8060501 排列问题 导出时,数字和字符的排列格式默认不一样,数字靠右,字符靠左 ...
- ubuntu16.04LTS安装软件
1.安装chrome 下载源加入到系统的源列表 sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/ ...
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
序列性容器::(vector和list和deque) erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被 删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式, ...
- 2 TypeScript--Hello World
安装好TypeScript后,我们来完成第一个页面--Hello World 新建index.html文件: <!DOCTYPE html> <html> <head&g ...
- IIS+Asp.Net Mvc必须知道的事(解决启动/重启/自动回收站点后第一次访问慢问题)
问题现象: Asp.net Mvc站点部署在IIS上后,第一个用户第一次访问站点,都会比较慢,确切的说是访问站点的Action页面(即非静态页面,因为静态页面直接由IIS处理返回给用户即完成请求,而A ...
- mongodb Failed to start LSB: An object/document-oriented dat
解决办法: cd /var/lib sudo rm -rf ./mongodb sudo mkdir mongodb sudo chown -R mongodb mongodb/ sudo servi ...
- ora-12541无监听的一种场景
项目上突然出现无法连接Oracle数据库的情况,提示无监听程序. 现象: 查看 listener.ora配置无问题,用Net Configuration Assistant重建监听,NCA也处于假死状 ...
- iOS开发——高级篇——多线程GCD死锁
面试题 请问以下代码打印结果: - (void)interview01 { // 以下代码是在主线程执行的 NSLog(@"执行任务1"); dispatch_queue_t qu ...
- iOS开发——高级篇——线程保活
线程保活: 顾名思义,就是保护线程不死(保证线程处于激活状态,生命周期没有结束) 正常情况,当线程执行完一次任务之后,需要进行资源回收,也就意味着生命周期结束 应用场景: 当有一个任务,随时都有可能去 ...