矩阵乘法求斐波那契数列(快速幂)
来源:互联网 发布:windows无法访问\\ 编辑:程序博客网 时间:2024/04/29 01:23
首先介绍矩阵乘法:
定义:设A=( )为 的矩阵,B=( )为 的矩阵,那么称 的矩阵C=( )为矩阵A与B的乘积,记作 ,其中矩阵C中的第 第 列元素为
由定义可知,
1:当矩阵A的列数等于矩阵B的行数时,A与B可以相乘。
2:矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
3:乘积C的第 行第 列的元素 等于矩阵A的第 行的元素与矩阵B的第 列对应元素乘积之和。
c[i][j]=Σa[i][k]*b[k][j]。
例如:
定义矩阵
注意 矩阵乘法一般不满足交换律。即:
然后由该数列定义可知,
所以目的就是求出前面的系数,需要用到快速幂(当然,如果比较小的话就不需要了,其实如果比较小也不需要用矩阵。。。)
至于快速幂就是和普通的是一样的,只是相乘就需要用到矩阵相乘啦。
</pre><pre name="code" class="cpp">#include <cstdio>#include <iostream>using namespace std;int T,n;long long q;struct aaaa{ long long a[2][2];}base,ans;void get_f(void);aaaa cheng(aaaa a,aaaa b);int main(){ cin>>T;while(T--){ cin>>n>>q; get_f(); cout<<(ans.a[1][0]+ans.a[1][1])%q<<endl;}return 0;}void get_f(void){ ans.a[0][0]=ans.a[1][1]=1;ans.a[0][1]=ans.a[1][0]=0;base.a[0][0]=base.a[0][1]=base.a[1][0]=1;base.a[1][1]=0;while(n>0){//特别说明,之前说是n-1次,那么我使用下面的f[(n+1)-1]就是f[n]了 if(n&1){ ans=cheng(ans,base);}base=cheng(base,base);n=n>>1;}}aaaa cheng(aaaa a,aaaa b){ aaaa x;x.a[0][0]=a.a[0][0]*b.a[0][0]+a.a[0][1]*b.a[1][0];x.a[0][0]%=q;x.a[0][1]=a.a[0][0]*b.a[0][1]+a.a[0][1]*b.a[1][1];x.a[0][1]%=q;x.a[1][0]=a.a[1][0]*b.a[0][0]+a.a[1][1]*b.a[1][0];x.a[1][0]%=q;x.a[1][1]=a.a[1][0]*b.a[0][1]+a.a[1][1]*b.a[1][1];x.a[1][1]%=q;return x;}
0 0
- 矩阵乘法求斐波那契数列(快速幂)
- 矩阵快速幂,求斐波那契数列
- 矩阵乘法 求斐波那契数列
- 矩阵乘法 求斐波那契数列
- 矩阵乘法求斐波那契数列
- 矩阵乘法求斐波那契数列
- Fibonacci数列(矩阵乘法快速幂)
- Fibonacci数列(矩阵乘法快速幂)
- 数列(矩阵乘法+快速幂)
- Xn数列(矩阵乘法+快速幂+慢速乘法)
- 再论斐波那契数列(矩阵&快速幂)
- 斐波那契数列(矩阵快速幂)
- *矩阵快速幂(斐波那契数列模板)
- 斐波那契数列 (矩阵快速幂)
- 斐波那契数列-矩阵乘法
- hdu_1588_矩阵_求和_乘法_快速幂_斐波那契数列求前n项和
- 矩阵快速模幂 + 求斐波那契数列第n项(Fibonacci)
- hdu 4549 M斐波那契数列(矩阵乘法+降幂公式)
- 简单的C++游戏载入界面设计
- c++のeof
- 关于动态代理的初步认识
- 详细研究CSS列表
- Java 事务管理
- 矩阵乘法求斐波那契数列(快速幂)
- MySQL学习笔记(一)--SQL语句
- 懒加载
- VC++6.0设置RTTI,以支持运行时执行dynamic_cast<>等RTTI运算符。
- Android viewpager 切换adapter内存溢出的问题
- lucene
- 关于 (&a+1) 的困惑
- replace与replaceAll的区别
- java 练习