Loading

矩阵板子

1. 矩阵快速幂、加速数列递推与高斯消元解线性方程组

1. 矩阵模板

struct matrix{int n,m,a[110][110];};
matrix input(int n,int m)//输入矩阵
{
	matrix A;A.n=n;A.m=m;
	for(int i=1ll;i<=A.n;i++)
		for(int j=1ll;j<=A.m;j++)
			scanf("%lld",&A.a[i][j]);
	return A;
}
void output(matrix A)//输出矩阵
{
	for(int i=1ll;i<=A.n;i++)
	{
		for(int j=1ll;j<=A.m;j++)printf("%lld ",A.a[i][j]);
		printf("\n");
	}
}
void clear(matrix A)//清空矩阵
{
	memset(A.a,0,sizeof(A.a));
	A.n=A.m=0;
}
matrix unit(int n)//矩阵单位元
{
	matrix A;A.n=A.m=n;
	for(int i=1ll;i<=A.n;i++)
		for(int j=1ll;j<=A.m;j++)
			A.a[i][j]=(i==j);
	return A;
}
matrix add(matrix A,matrix B)//矩阵加法
{
	matrix C;memset(C.a,0,sizeof(C.a));C.n=C.m=A.n;
	for(int i=1ll;i<=C.n;i++)
		for(int j=1ll;j<=C.m;j++)
			C.a[i][j]=(A.a[i][j]+B.a[i][j])%mod;
 	return C;
}
matrix mul(matrix A,matrix B)//矩阵乘法
{
	matrix C;memset(C.a,0,sizeof(C.a));C.n=A.n;C.m=B.m;
	for(int i=1ll;i<=C.n;i++)
		for(int j=1ll;j<=C.m;j++)
			for(int k=1ll;k<=A.m;k++)
				C.a[i][j]=(((long long)A.a[i][k]*B.a[k][j])%mod+C.a[i][j])%mod;
 	return C;
}
matrix qpow(matrix A,int n)//矩阵快速幂
{
	if(n==1ll)return A;
	matrix B=qpow(A,n/2ll);
	B=mul(B,B);
	if(n%2ll==1ll)B=mul(B,A);
	return B;
}

2. 矩阵快速幂加速数列递推

//广义斐波那契数列
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int mod;
struct matrix{int n,m,a[4][4];};
matrix unit(int n)
{
	matrix A;A.n=A.m=n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			A.a[i][j]=(i==j);
	return A;
}
matrix mul(matrix A,matrix B)
{
	matrix C;memset(C.a,0,sizeof(C.a));C.n=A.n;C.m=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.a[i][j]=(((long long)A.a[i][k]*B.a[k][j])%mod+C.a[i][j])%mod;
	return C;
}
matrix qpow(matrix A,int n)
{
	if(n==1)return A;
	matrix B=qpow(A,n/2);
	B=mul(B,B);
	if(n&1)B=mul(B,A);
	return B;
}
matrix A,B,ans;
int p,q,a1,a2,n,m;
signed main()
{
	scanf("%d%d%d%d%d%d",&p,&q,&a1,&a2,&n,&m);
	mod=m;
	A.n=1;A.m=2;
	A.a[1][1]=a1;A.a[1][2]=a2;
	B.n=B.m=2;
	B.a[1][1]=0;B.a[1][2]=q;
	B.a[2][1]=1;B.a[2][2]=p;
	if(n<=2)
	{
		if(n==1)printf("%d\n",a1);
		if(n==2)printf("%d\n",a2);
	}
	else
	{
		ans=qpow(B,n-2);
		ans=mul(A,ans);
		printf("%d\n",ans.a[1][2]);
	}
	return 0;
}

3. 高斯消元

3.1 朴素高斯消元

3.2 band-matrix

posted @ 2021-02-18 15:52  pjykk  阅读(83)  评论(0编辑  收藏  举报