矩阵快速幂模板及其应用(洛谷3390)(洛谷1962)
2017-07-27 20:39
344 查看
题意:给定n*n的矩阵A,求A^k
代码,思路见前一篇。
应用斐波那契数列,构造一个1{1,1,1,0}的2*2矩阵就可以做了
注意特判
代码,思路见前一篇。
#include<bits/stdc++.h> #define maxn 120 #define mod 1000000007 #define LL long long using namespace std; LL n,k; struct Matrix {LL s[maxn][maxn];}; Matrix operator * (Matrix a,Matrix b) { Matrix tmp; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { LL x=0; for(int k=1;k<=n;k++) x+=(a.s[i][k]*b.s[k][j])%mod; tmp.s[i][j]=x%mod; } return tmp; } Matrix Pow(Matrix a,LL k) { Matrix b; for(int i=1;i<=n;i++) b.s[i][i]=1; while(k) { if(k&1) b=b*a; a=a*a; k>>=1; } return b; } int main() { cin>>n>>k; Matrix a; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a.s[i][j]; a=Pow(a,k); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) cout<<a.s[i][j]%mod<<" "; cout<<"\n";} return 0; }
应用斐波那契数列,构造一个1{1,1,1,0}的2*2矩阵就可以做了
注意特判
#include<bits/stdc++.h> #define maxn 120 #define mod (1000000007) #define LL long long using namespace std; LL n,k; struct Node{ LL s[maxn][maxn]; }str; void init() { for(int i=1;i<=maxn;i++) str.s[i][i]=1; } Node operator * (Node a,Node b) { Node tmp; LL x=0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { x=0; for(int k=1;k<=n;k++) x+=a.s[i][k]*b.s[k][j]%mod; tmp.s[i][j]=x%mod; } return tmp; } Node Pow(Node a) { Node tmp=str; while(k) { if(k&1) tmp=tmp*a; a=a*a; k>>=1; } return tmp; } int main() { init();n=2; cin>>k; if(k==0) cout<<"0"<<endl; if(k==1) cout<<"1"<<endl; else { Node ans; ans.s[1][1]=ans.s[1][2]=ans.s[2][1]=1; ans.s[0][0]=0; k--; ans=Pow(ans); cout<<ans.s[1][1]<<endl; } return 0; }
相关文章推荐
- 洛谷 P3390 【模板】矩阵快速幂
- 洛谷 P3390 【模板】矩阵快速幂
- 洛谷 P3390 【模板】矩阵快速幂
- 洛谷 P1939 【模板】矩阵加速(数列):优化递推式的方法——矩阵快速幂
- 整数快速幂(取模)、矩阵快速幂及其应用
- 扩展欧几里得、求乘法逆元及其应用、中国剩余定理(互质版和非互质版)、欧拉函数、快速判素数模板
- 关于矩阵相乘快速幂的理解及其用处
- 洛谷1939 【模板】矩阵加速(数列)
- Covering HDU - 6185 矩阵快速幂 or杜教模板
- 一种极快速去模糊效应图像细节增强及其应用
- 矩阵快速幂模板
- 【模板】矩阵快速幂
- 矩阵乘法快速幂模板
- 矩阵快速幂模板
- OpenCV中的模板匹配方法及其应用
- luogu P3390 【模板】矩阵快速幂
- 海森矩阵及其应用
- 洛谷P3390 【模板】矩阵快速幂
- How many ways?? - hdu2157(矩阵快速幂-模板)
- P3390 【模板】矩阵快速幂