Luogu P1962 斐波那契数列(矩阵乘法模板)
累了 明天再解释
做这道题需要一些关于矩阵乘法的基础知识。
1. 矩阵乘法的基础运算

只有当矩阵A的列数等于矩阵B的行数时,A与B可以相乘(A的行数不一定等于B的列数)。
代码实现(重载运算符):
struct matrix {
int ma[][];
};
matrix operator * (const matrix &A,const matrix &B) {
matrix C;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
for(int k = ; k < 3; k++)
C.ma[i][j] = C.ma[i][j] + A.ma[i][k] * B.ma[k][j];
return C;
}
2. 单位矩阵
或

回到这道题:
因为 f[i] = f[i-1] + f[i-2],首先构造一个矩阵 [ f[i] f[i-1] ]
它应该等于 [ f[i-1] f[i-2] ] * A.
由于f[i] = f[i-1] *1 + f[i-2]*1,所以矩阵A的第一列应该都为1;
f[i-1] = f[i-1] *1 + f[i-2]*0,所以第二列为1和0;
即


void quickpow(int b) {
while(b) {
if(b & ) ans = ans * base;
base = base * base;
b >>= ;
}
}
int main() {
if(n <= ) {
printf("");
return ;
}
base.a[][] = base.a[][] = base.a[][] = ;
ans.a[][] = ans.a[][] = ;
quickpow(n - );
printf("%d",ans.a[][]);
return ;
}
- 一个小优化:当base自乘时,求出的数组刚好为

代码如下(我做的时候没有用重载运算符而是写了个函数来实现矩阵乘法的)
#include<cstdio>
#define ll long long
using namespace std;
const ll mod = ; struct matrix {
ll ma[][];
}; matrix ans;
ll n; matrix mul(matrix A,matrix B) {
matrix C;
C.ma[][] = C.ma[][] = C.ma[][] = C.ma[][] = ;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
for(int k = ; k < ; k++)
C.ma[i][j] += A.ma[i][k] * B.ma[k][j] % mod;
return C;
} matrix quickpow(matrix A,ll n) {
matrix B;
B.ma[][] = B.ma[][] = ;
B.ma[][] = B.ma[][] = ;
while(n) {
if(n&)B = mul(A,B);
A = mul(A,A);
n >>= ;
}
return B;
} int main() {
scanf("%lld",&n);
matrix A;
A.ma[][] = A.ma[][] = A.ma[][] = ;
A.ma[][] = ;
ans = quickpow (A,n);
printf("%lld",ans.ma[][]%mod);
return ;
}
Luogu P1962 斐波那契数列(矩阵乘法模板)的更多相关文章
- 斐波那契数列 矩阵乘法优化DP
斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007\),\(n\le 10^{18}\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...
- [luogu P1962] 斐波那契数列(带快速幂矩阵乘法模板)
题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...
- 洛谷P1962 斐波那契数列(矩阵快速幂)
题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...
- P1349 广义斐波那契数列(矩阵乘法)
题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatr ...
- Codevs 1574 广义斐波那契数列(矩阵乘法)
1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如an=p*an-1+q* ...
- [codevs]1250斐波那契数列<矩阵乘法&快速幂>
题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30 ...
- [LUOGU] P1962 斐波那契数列
求斐波那契第n项. [f(n-1) f(n)] * [0,1] = [f(n) f(n+1)] [1,1] 由此原理,根据矩阵乘法的结合律,用快速幂算出中间那个矩阵的n次方即可. 快速幂本质和普通快速 ...
- 4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造
一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了. 关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了. 当k==1时 显然的矩阵乘法 多开一个位置维护前缀和 ...
随机推荐
- 网页三剑客:HTML+CSS+JavaScript 之CSS概述
CSS 简介 什么是 CSS? CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是 ...
- Python 练习:简单的购物车
salary = int(input("Please input your salary: ")) msg = ''' 1. iphone6s 5800 2. mac book 9 ...
- 洛谷P4563 [JXOI2018]守卫(dp)
题意 题目链接 Sol 非常有意思的题目. 我们设\(f[l][r]\)表示区间\([l,r]\)的答案. 显然\(r\)位置一定有一个保镖 同时不难观察到一个性质:拿\([1, n]\)来说,设其观 ...
- 【读书笔记】iOS-基带攻击
一,iOS设备中的蜂窝网络通信栈运行在专门的芯片上,这个芯片就是数字基带处理器. 参考资料:<黑客攻防技术宝典-iOS实战篇>
- PostgreSQL 10 如何使用 PgAdmin3
自从 PgAdmin4 出来以后,PgAdmin3 就停止开发了,PgAdmin 官网下载的 PgAdmin3 无法支持 PostgreSQL 10 或者更高版本的数据库服务器端. 但是 PgAdmi ...
- 安卓开发_浅谈Fragment之事务添加Fragment对象
我们都知道给一个activity动态添加fragment的时候 有下面几种添加方式 看一下布局文件 <LinearLayout xmlns:android="http://schema ...
- (网页)AngularJS中【Error: [$rootScope:inprog]】的解决办法(转)
转自CSDN: Error: [$rootScope:inprog] http://errors.angularjs.org/1.5.8/$rootScope/inprog?p0=%24apply 如 ...
- (网页)HTML小技巧的一些小技巧
转自CSDN: 1.怎样定义网页语言(字符集)? 在制作网页过程中,你首先要定义网页语言,以便访问者浏览器自动设置语言,而我们用所见即所得的HTML工具时,都没有注意到这个问题, ...
- flask day01
目标:搭建好一个flask架构,并且可以运行起来,能够访问 ## 一丶配置环境 比较简单,只需要配一个flask pip3 install flask #也可以使用pip install flask ...
- 使用Anemometer基于pt-query-digest将MySQL慢查询可视化
最近玩MySQL,发现了一个很不错的工具,可以把MySQL慢查询可视化,方便我们去找出和分析慢询语句,搭建的步骤不多,但网上详细教程比较少,说得也不够详细,一不小心,估计得蛋痛一会,哈哈 Percon ...