矩阵快速幂与快速斐波那契数列
矩阵快速幂与快速斐波那契数列
已知
根据矩阵乘法规律
推得
即
所以有
同理斐波那契数列为
矩阵乘法:
#define ll long long
const int N = 3,mod = 1e9 + 7;
struct jz{
ll a[N][N];
jz(){memset(a,0,sizeof(a));}//构造
jz(bool f){memset(a,0,sizeof(a));//单位矩阵
for(int i = 1;i <= 2;i++)
a[i][i] = 1;
}//构造单位矩阵
jz operator*(const jz &other)const{
jz ans;
for(int i = 1;i <= 2;i++)
for(int j = 1;j <= 2;j++)
for(int k = 1;k <= 2;k++)
ans.a[i][j] = (ans.a[i][j] + a[i][k]*other.a[k][j]) % mod;
return ans;
}
}
单位矩阵:
从左上角到右下角的对角线上的元素均为1。除此以外全都为0。根据单位矩阵的特点,任何矩阵与单位矩阵相乘都等于本身
矩阵快速幂:
jz jzfpow(jz a,ll n){
jz ans(true);
while(n){
if(n&1) ans = (ans*a);
n >>= 1;
a=a*a;
}
return ans;
}
const ll N = 101,mod = 1e9 + 7;
int n;
struct jz{
ll a[N][N];
jz(){memset(a,0,sizeof(a));}//构造
jz(bool f){memset(a,0,sizeof(a));//单位矩阵
for(int i = 1;i <= n;i++)
a[i][i] = 1;
}//构造单位矩阵
jz operator*(const jz &other)const{
jz ans;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
for(int k = 1;k <= n;k++)
ans.a[i][j] = (ans.a[i][j] + (a[i][k]*other.a[k][j]) % mod) % mod;
return ans;
}
};
jz jzfpow(jz a,ll n){
jz ans(true);
while(n){
if(n&1) ans = (ans*a);
n >>= 1;
a=a*a;
}
return ans;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效