复习:矩阵快速幂
前言
emmm太久了忘了许多 写笔记来复习一下
概念
矩阵乘法
什么是矩阵乘法?
给你两个矩阵
则令 有
,
两个矩阵做乘法的前提:
找不到图片了 网上自取
抽象于行乘列即可
Code
node init(int n,int m)
{
node c;
c.n=n;
c.m=m;
for(int i=1;i<=c.n;i++)
for(int j=1;j<=c.m;j++)
c.r[i][j]=0;
return c;
}
node operator *(node a,node b)
{
node c=init(a.n,b.m);
for(int i=1;i<=c.n;i++)
for(int j=1;j<=c.m;j++)
for(int k=1;k<=a.m;k++)
c.r[i][j]=(c.r[i][j]+a.r[i][k]*b.r[k][j])%mod;
return c;
}
初始矩阵
node clear(int n)
{
node c=init(n,n);
for(int i=1;i<=n;i++)
c.r[i][i]=1;
return c;
}
初始矩阵满足 满足任意矩阵 使得
注意初始
性质
定义矩阵
- 矩阵结合律:
- 矩阵拆:
注意 矩阵不存在交换律
矩阵快速幂
因为矩阵满足结合律 因此可以直接快速幂优化时间
node Qpow(node a,ll x)
{
node sum=clear(a.m);
while(x>0)
{
if(x&1) sum=sum*a;
a=a*a;
x/=2;
}
return sum;
}
矩阵优化递推 P1939
令初始数组为 把其看成 思考如何推成
发现构造矩阵:
则即可转移一位
答案就是
矩阵优化快速幂即可
int main()
{
a.n=1,a.m=3;
a.r[1][1]=1,a.r[1][2]=1,a.r[1][3]=1;
b.n=b.m=3;
b.r[1][1]=1,b.r[1][2]=1,b.r[1][3]=0;
b.r[2][1]=0,b.r[2][2]=0,b.r[2][3]=1;
b.r[3][1]=1,b.r[3][2]=0,b.r[3][3]=0;
scanf("%d",&g);
while(g--)
{
scanf("%d",&n);
printf("%lld\n",(a*Qpow(b,n-3)).r[1][1]);
}
return 0;
}
矩阵优化 DP P4838
定义表示后缀为 的方案数
定义表示后缀为 的方案数
定义表示后缀为 的方案数
容易得到简单 dp
for(int i=3;i<=n;i++)
f[i][0]=f[i-1][2],
f[i][1]=f[i-1][0],
f[i][2]=f[i-1][0]+f[i-1][1]+f[i-1][2];
容易构造简单矩阵
套上矩阵快速幂即可快速求解
Code
int main()
{
a.n=1,a.m=3;
a.r[1][1]=1,a.r[1][2]=1,a.r[1][3]=2;
b.n=b.m=3;
b.r[1][1]=0,b.r[1][2]=1,b.r[1][3]=1;
b.r[2][1]=0,b.r[2][2]=0,b.r[2][3]=1;
b.r[3][1]=1,b.r[3][2]=0,b.r[3][3]=1;
scanf("%d",&g);
while(g--)
{
scanf("%d",&n);
if(n==1) printf("2\n");
else
{
node ans=a*Qpow(b,n-2);
printf("%lld\n",(ans.r[1][1]+ans.r[1][2]+ans.r[1][3])%mod);
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」