首页 > 其他分享 >复习:矩阵快速幂

复习:矩阵快速幂

时间:2023-08-12 23:13:42浏览次数:35  
标签:node 复习 int sum 矩阵 bmatrix 快速 scanf

前言

emmm太久了忘了许多 写笔记来复习一下

概念

矩阵乘法

什么是矩阵乘法

给你两个矩阵\(a,b\)

则令\(c=a*b\) 有

\(c_n=a_n\),\(c_m=b_m\)

\[\sum\limits_{i=1}^{c_n}\sum\limits_{j=1}^{c_m} c_{i,j}\sum\limits_{k=1}^{a_m}a_{i,k}*b_{k,j} \]

两个矩阵做乘法的前提:\(a_m=b_n\)

找不到图片了 网上自取

抽象于行乘列即可

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;
}

初始矩阵满足 \(P\) 满足任意矩阵 \(a\) 使得\(P*a=a\)

注意初始\(P_n=P_m=a_m\)

性质

定义矩阵\(a,b,c\)

  • 矩阵结合律:\(a*b*c=a*(b*c)\)
  • 矩阵拆:\((a*b)^x=a^xb^x\)

注意 矩阵不存在交换律

矩阵快速幂

因为矩阵满足结合律 因此可以直接快速幂优化时间

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

令初始\(A\)数组为\((1,1,1)\) 把其看成\(a_{i-1},a_{i-2},a_{i-3}\) 思考如何推成\(a_{i},a_{i-1},a_{i-2}\)

发现构造矩阵:

\[b=\begin{bmatrix} 1&1&0\\0&0&1\\1&0&0 \end{bmatrix} \]

则\(a*b\)即可转移一位

答案就是\(a*b^n\)

矩阵优化快速幂即可

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

定义\(f_{i,0}\)表示后缀为 \(\texttt{a}\) 的方案数

定义\(f_{i,1}\)表示后缀为 \(\texttt{aa}\) 的方案数

定义\(f_{i,2}\)表示后缀为 \(\texttt{b}\) 的方案数

容易得到简单 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];

容易构造简单矩阵

\[\begin{bmatrix}0&1&1\\0&0&1\\1&0&1 \end{bmatrix} \]

套上矩阵快速幂即可快速求解

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;
}

标签:node,复习,int,sum,矩阵,bmatrix,快速,scanf
From: https://www.cnblogs.com/g1ove/p/17625809.html

相关文章

  • 算法——初级排序算法之快速排序
    介绍快速排序可以说是应用最广泛的排序算法了,主要是因为实现简单、适用于各种不同的输入数据且在一般应用中比其他排序算法都要快得多。快速排序是一种基于分治思想的排序算法。它将一个数组分成两个子数组,将两部分独立地排序。原理设置两个变量low、high,排序开始时:low=0,hig......
  • 1572. 矩阵对角线元素的和
    1572.矩阵对角线元素的和2023年8月12日19:07:511572.矩阵对角线元素的和简单给你一个正方形矩阵mat,请你返回矩阵对角线元素的和。请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。示例1:输入:mat=[[1,2,3],[4,5,6],[......
  • 1572. 矩阵对角线元素的和
    题目链接给定一个正方形矩阵,返回对角线元素的和(两条对角线,中心的元素不要叠加两次)。第一种方法:遍历矩阵矩阵中某个位置(i,j)如果处于对角线上。则一定满足下列条件之一:i=j;i+j=n-1;根据上边的结论,可以遍历整个矩阵。如果满足条件之一,则表示该元素在对角线上,加入到......
  • 封装矩阵一系列
    structMatrix{typedeflonglongll;constllmod=1000000007;llmatrix[110][110];//矩阵里的每一个数llline,colu;//矩阵的行,列Matrixoperator*(constMatrix&b)const{Matrixans;ans.line=line,ans.colu=......
  • IDEA集成docker并快速部署Springboot项目
    前言:现在docker是我们常用的服务部署方式了,在微服务中对于springboot部署到docker一般有两种方式1、把jar包扔给运维同学,由他们进行编写dockerfile或者其他方式部署。(不推荐)2、由开发同学处理后把镜像或者容器上传到服务器(企业级常用方式)下面我们就通过demo来看下方式二......
  • python复习笔记
    文件操作w=open("c://....","r"或"w"或"a",encoding='utf-8')#字符串后跟b表示二进制文件w.readlines()#读出所有行存入listw.readline()#读出一行,若读完了返回""w.read()#读出所有字符构成字符串w.write("abab")#写入w.close()#关闭impo......
  • 复习 - Java 基本语法
    前言有两年没有怎么使用过Java了,重新复习一下基础的内容,特此记录。视频课程为B站尚硅谷宋红康java基础视频。关键字和保留字关键字定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中的所有字母都为小写保留字定义:现有的Java版本尚未使用,但以后版本......
  • 快速排序(NB)
    博客地址:https://www.cnblogs.com/zylyehuo/#_*_coding:utf-8_*_defpartition(li,left,right):tmp=li[left]whileleft<right:whileleft<rightandli[right]>=tmp:#从右面找比tmp小的数right-=1#往左走一步l......
  • 4954: 矩阵游戏
    题目描述婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的\(n\)行\(m\)列的矩阵(你不用担心她如何存储)。她生成的这个矩阵满足一个神奇的性质:若用\(F[i,j]\)来表示矩阵中第\(i\)行第\(j\)列的元素,则\(F[i,j]\)满足下面的递推式:\[\begin{aligned}F[1,1]&=......
  • rem布局快速写法
    vw的兼容性已经没问题,现在推荐优先使用vw但是rem布局还是有其用武之地,比如需要动态改变字体大小的场景(有小,中,大三种字体,可手动选择,方便不同人群查看)vw和rem的兼容性|兼容性|ios|安卓||rem|4.1+|2.1+||vw|6.1+|4.4+|js快速写法(与设计稿不挂钩)docu......