矩阵快速幂板子
很多素材来自网上,仅为个人复习用
note 1:
矩阵乘法+快速幂解决 费波列切(不)数列问题
首先复习一下快速幂
快速幂代码
#pragma GCC optimize(2) #pragma GCC optimize(3,"Ofast","inline") #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<map> #include<cmath> typedef long long ll; using namespace std; ll qmi(ll a,ll b,ll c) { ll res=1; while(b) { if(b&1) res=res*a%c; a=a*a%c; b>>=1; } return res; } int main() { ll a,b,c; cin>>a>>b>>c; cout<<a<<'^'<<b<<' '<<"mod"<<' '<<c<<'='<<qmi(a,b,c); }
当b为奇数的时候,/2会导致有一个a被忽略掉,在ans这补上
模拟过程
矩阵幂过程
板子代码
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<map> #include<cmath> typedef long long ll; using namespace std; struct martix{ ll fufu[306][306]; }; ll p; martix marmul(martix m,martix b) { martix tmp; for (ll i=0;i<p;i++) for (ll j=0;j<p;j++) { tmp.fufu[i][j]=0; for (ll k=0;k<p;k++) tmp.fufu[i][j]+=(m.fufu[i][k]*b.fufu[k][j])%1000000007; tmp.fufu[i][j]%=1000000007; } return tmp; } martix marpow(martix a,ll n) { martix b; for(ll i=0;i<p;i++) for(ll j=0;j<p;j++) if(i==j) b.fufu[i][j]=1; else b.fufu[i][j]=0; while(n) { if (n&1) b=marmul(b,a); n=n>>1; a=marmul(a,a); } return b; } int main() { ll n,k; cin>>n>>k; martix a,b; p=n; for(ll i=0;i<p;i++) for(ll j=0;j<p;j++) cin>>a.fufu[i][j]; a=marpow(a,k); for(ll i=0;i<p;i++) { for(ll j=0;j<p;j++) cout<<a.fufu[i][j]<<' '; cout<<endl; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义