20分求助
查看原帖
20分求助
754444
tamamocross楼主2023/5/8 08:15
#include<iostream>
#include<cstring>
long long mode=1e9+7;
using namespace std;
class Matrix{
	private:long long M[20][20];
	int R;int C;
	public:
	Matrix(int r=0,int c=0){
		memset(M,0,sizeof(M));
		R=r,C=c;
	}
	long long v(int l,int r){
		return M[l][r];
	}
	void ini(){
		for(int i=1;i<=R;i++){
			for(int j=1;j<=C;j++){
				cin>>M[i][j];
			}
		}
	}
	friend Matrix operator *(Matrix a,Matrix b){//行 X 列 
		if(a.C!=b.R){
		Matrix ans;
			return ans;
		}else{
			Matrix ans(a.R,b.C);
			for(int i=1;i<=a.R;i++){
				for(int j=1;j<=b.C;j++){
					for(int k=1;k<=a.C;k++){
						ans.M[i][j]+=a.v(i,k)*b.v(k,j);
						ans.M[i][j]%=mode;
					}
				}
			}
			return ans;
		}
	}
	friend ostream& operator <<(ostream &b,Matrix &a){
		for(int i=1;i<=a.R;i++){
			for(int j=1;j<=a.C;j++){
				b<<a.M[i][j]<<" ";
			}
			b<<endl;
		}
		return b;
	}	
	friend Matrix operator^ (Matrix ,int );
	friend void INI();
	friend void A();
	friend void B();
};
Matrix BASE(2,2);
Matrix operator^ (Matrix a,int b){
	Matrix base=a;
	Matrix ans=BASE;
		while(b!=1){
			bool flag=false;
			if(b&1){
				flag=true;
				b--;
			}
			base=base*base;
			if(flag){
			ans=a*ans;
			}
			b>>=1;
		}
		return ans*base;
		}
void INI(){
	memset(BASE.M,0,sizeof(BASE.M));
		for(int i=1;i<=2;i++){
			BASE.M[i][i]=1;
		}
	}
	Matrix a(1,2);
	Matrix b(2,2);
void A(){
	for(int i=1;i<=2;i++){
		a.M[1][i]=1;
	}
	return;
}
void B(){
	b.M[1][2]=1;
	b.M[2][1]=1;
	b.M[2][2]=1;
}
int main(){
	INI();
	A();
	B();
	Matrix c;
	int n;
	cin>>n;
	if(n==1||n==2){
		cout<<1;
		return 0;
	}
	b=b^(n-2);
	c=a*b;
	cout<<c.v(1,2);
}
2023/5/8 08:15
加载中...