求助区别
查看原帖
求助区别
304524
崔化博楼主2022/5/17 21:44

为什么用单位矩阵乘后再乘[a2,a1]就可以?

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
long long p,q,a1,a2,n,mod;
struct node {
	long long a[3][3];
	void build(){
		memset(a,0,sizeof(a));
	}
	void chu(){
		a[1][1]=p,a[1][2]=q;
		a[2][1]=1;
	}
	void qqq(){
		a[1][1]=a2,a[2][1]=a1;
	}
	void dan(){
		for(int i=1;i<=2;++i)a[i][i]=1;
	}
	node operator *(const node &b)const{
		node res;
		res.build();
		for(int k=1;k<=2;++k){
			for(int i=1;i<=2;++i){
				for(int j=1;j<=2;++j){
					res.a[i][j]=(res.a[i][j]+(a[i][k]*b.a[k][j]))%mod;
				}
			}
		}
		return res;
	}
};
void pow_print(long long b) {
	node a;
	a.build();
	a.chu();
	node res;
	res.build();
	res.dan();
	while(b){
		if(b&1)res=res*a;
		a=a*a;
		b>>=1;
//		for(int i=1;i<=2;++i){
//			for(int j=1;j<=2;++j)
//				cout<<res.a[i][j]<<' ';
//			cout<<'\n';
//		}
	}
	node q;
	q.qqq();
	cout<<(res*q).a[1][1]<<'\n';
}
int main() {
	cin>>p>>q>>a1>>a2>>n>>mod;
	if(n<=2) {
		if(n==1)
			cout<<a1;
		else
			cout<<a2;
		return 0;
	}
	pow_print(n-2);
	return 0;
}
/*
p q 
1 0
*/

而直接用[a2,a1]乘就不行

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
long long p,q,a1,a2,n,mod;
struct node {
	long long a[3][3];
	void build(){
		memset(a,0,sizeof(a));
	}
	void chu(){
		a[1][1]=p,a[1][2]=q;
		a[2][1]=1;
	}
	void qqq(){
		a[1][1]=a2,a[2][1]=a1;
	}
	void dan(){
		for(int i=1;i<=2;++i)a[i][i]=1;
	}
	node operator *(const node &b)const{
		node res;
		res.build();
		for(int k=1;k<=2;++k){
			for(int i=1;i<=2;++i){
				for(int j=1;j<=2;++j){
					res.a[i][j]=(res.a[i][j]+(a[i][k]*b.a[k][j]))%mod;
				}
			}
		}
		return res;
	}
};
void pow_print(long long b) {
	node a;
	a.build();
	a.chu();
	node res;
	res.build();
	res.qqq();
	while(b){
		if(b&1)res=res*a;
		a=a*a;
		b>>=1;
//		for(int i=1;i<=2;++i){
//			for(int j=1;j<=2;++j)
//				cout<<res.a[i][j]<<' ';
//			cout<<'\n';
//		}
	}
	node q;
	q.qqq();
	cout<<(res).a[1][1]<<'\n';
}
int main() {
	cin>>p>>q>>a1>>a2>>n>>mod;
	if(n<=2) {
		if(n==1)
			cout<<a1;
		else
			cout<<a2;
		return 0;
	}
	pow_print(n-2);
	return 0;
}
/*
p q 
1 0
*/
2022/5/17 21:44
加载中...