关于矩阵乘法的疑问
查看原帖
关于矩阵乘法的疑问
537046
大眼仔Happy楼主2024/3/11 21:37

有点分不清左乘和右乘。。。

然后不是可以把向量看成一个矩阵吗?就是 1×n1\times n 的矩阵,然后可以写到 n×nn\times n 的矩阵的第一列,其他填 00。

我写的时候写到了最后一列发现也可以 AC,而且把乘法的顺序改过来同样可行,这是为啥。(就是代码的 ans.M[sz][0] 改成了 ans.M[sz][sz])

#include<bits/stdc++.h>
using namespace std;
#define FOR(i,st,ed) for(int i=st;i<=ed;i++)
#define ROF(i,st,ed) for(int i=st;i>=ed;i--)
#define ll long long
const int N=1<<6,f[]={1,1,2,3,5,8,13};
const ll mod=998244353;
ll n,m,sz;ll cnt[N];
ll inline read()
{
	ll num=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
	return num*f;
}
struct Matrix
{
	ll M[N][N];
	Matrix(){memset(M,0,sizeof(M));}
	void reset(){FOR(i,0,sz)M[i][i]=1;}
	Matrix friend operator *(const Matrix A,const Matrix B)
	{
		Matrix res;
		FOR(i,0,sz)FOR(j,0,sz)FOR(k,0,sz)
			res.M[i][j]=(res.M[i][j]+A.M[i][k]*B.M[k][j])%mod;
		return res;
	}
}A,ans;
void print(Matrix a){FOR(i,0,sz){FOR(j,0,sz)printf("%lld ",a.M[i][j]);printf("\n");}}
Matrix qp(Matrix a,ll b){Matrix res;res.reset();while(b){if(b&1)res=a*res;a=a*a;b>>=1;}return res;}
void init()
{
	// 初始化 A 
}
int main(){
	n=read();m=read();sz=(1<<n)-1;
	init();ans.M[sz][0]=1;
	ans=qp(A,m)*ans;
	printf("%lld\n",ans.M[sz][0]);
	return 0;
}
2024/3/11 21:37
加载中...