注意!!!
查看原帖
注意!!!
546730
billtun楼主2023/11/29 22:02

矩阵乘法不满足交换律!!!!

20pts code:

#include<bits/stdc++.h>
#define Maxn 105
#define ll long long

using namespace std;

ll p, q, a1, a2, n, MOD;
struct Matrix{
	ll a[Maxn][Maxn];
} A, Ans;

Matrix Times(Matrix a, Matrix b){
	Matrix ans;
	memset(ans.a, 0, sizeof(ans.a));
	for(ll i=1;i<=2;i++){
		for(ll j=1;j<=2;j++){
			for(ll k=1;k<=2;k++){
				ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%MOD;
			}
		}
	}
	return ans;
}

Matrix qpow(Matrix a, ll b){
	Matrix res;
	res.a[1][1]=1, res.a[1][2]=0;
	res.a[2][1]=0, res.a[2][2]=1;
	while(b){
		if(b&1){ res=Times(res, a); }
		a=Times(a, a);
		b>>=1;
	}
	return res;
}

int main()
{
	cin>>p>>q>>a1>>a2>>n>>MOD;
	if(n==1){ cout<<a1%MOD; return 0; }
	if(n==2){ cout<<a2%MOD; return 0; }
	A.a[1][1]=p, A.a[1][2]=q;
	A.a[2][1]=1, A.a[2][2]=0;
	Ans.a[1][1]=a2%MOD;
	Ans.a[2][1]=a1%MOD;
	Ans=Times(Ans, qpow(A, n-2));
	cout<<Ans.a[1][1];
	return 0;
}
/*
2 3 1 2 30 23

7
*/

100pts code:

#include<bits/stdc++.h>
#define Maxn 105
#define ll long long

using namespace std;

ll p, q, a1, a2, n, MOD;
struct Matrix{
	ll a[Maxn][Maxn];
} A, Ans;

Matrix Times(Matrix a, Matrix b){
	Matrix ans;
	memset(ans.a, 0, sizeof(ans.a));
	for(ll i=1;i<=2;i++){
		for(ll j=1;j<=2;j++){
			for(ll k=1;k<=2;k++){
				ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%MOD;
			}
		}
	}
	return ans;
}

Matrix qpow(Matrix a, ll b){
	Matrix res;
	res.a[1][1]=1, res.a[1][2]=0;
	res.a[2][1]=0, res.a[2][2]=1;
	while(b){
		if(b&1){ res=Times(res, a); }
		a=Times(a, a);
		b>>=1;
	}
	return res;
}

int main()
{
	cin>>p>>q>>a1>>a2>>n>>MOD;
	if(n==1){ cout<<a1%MOD; return 0; }
	if(n==2){ cout<<a2%MOD; return 0; }
	A.a[1][1]=p, A.a[1][2]=q;
	A.a[2][1]=1, A.a[2][2]=0;
	Ans.a[1][1]=a2%MOD;
	Ans.a[2][1]=a1%MOD;
	Ans=Times(qpow(A, n-2), Ans);
	cout<<Ans.a[1][1];
	return 0;
}
/*
2 3 1 2 30 23

7
*/
2023/11/29 22:02
加载中...