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时 显然的矩阵乘法 多开一个位置维护前缀和 ...
随机推荐
- linux学习笔记-文件相关知识
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.文件属性 在当前用户家目录下以ls -al命令输出为例: -rw-r--r-- 1 renren ...
- spring boot 随手记
1.当加入security 起步依赖后,如果不做任何手动配置的话,默认会跳转到一个登录页面,不管你喜不喜欢,所有的请求都必须登录,用户名和密码是保存在内存中的, 默认用户名是user 密码在控制台里 ...
- 【读书笔记】iOS-PhoneGap
以前,用PhoneGap平台创建的应用在提交到AppStore中的时候可能会遇到一些问题,不过PhoneGap 0.8.0版本已经很好地解决了这个问题,而且苹果公司也允许将通过PhoneGap构建的应 ...
- css清除默认样式
CSS 清除默认样式 通常有以下几句就够了: *{margin:0;padding:0} li{list-style:none} img{vertical-align:top;border:non ...
- Windows 10修复
[以管理员运行如下命令]: 1.sfc /scannow 命令将扫描所有受保护的系统文件,并用位于 %WinDir%\System32\dllcache 的压缩文件夹中的缓存副本替换损坏的文件. 2. ...
- loadrunner 11 安装与使用
注:以下链接均为转载,详细内容请查看原文. 安装教程: https://blog.csdn.net/u010731693/article/details/78986840 使用教程: https:// ...
- Five Android layouts
线性布局: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:an ...
- C# winform三种定时方法
1. 直接用winform 的 timers 拖控件进去 代码 public partial class Form1 : Form { public Form1() ...
- JavaScript变量提升的理解
变量提升 先说三句总结性的话: let 的「创建」过程被提升了,但是初始化没有提升. var 的「创建」和「初始化」都被提升了. function 的「创建」「初始化」和「赋值」都被提升了. 所以,我 ...
- Android清单文件合并的那些事
APK文件只能包含一个AndroidManifest.xml文件,但Android Studio项目可以包含多个文件(通过buildSrc.导入的库引入).因此,在构建应用时,Gradle构建会将所有 ...