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