矩阵乘法50pts求助
查看原帖
矩阵乘法50pts求助
285617
黑影洞人楼主2022/7/4 21:15

一开始感觉是水题,后来根据题意打完后发现似乎有细节

#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long
#define p 1000000007
using namespace std;
struct matrix{
	int m[2][2];
	matrix(){memset(m,0,sizeof(m));}
	void csh(){memset(m,0,sizeof(m));m[0][0]=m[1][1]=1;}
	void csh(int x,int y){
		memset(m,0,sizeof(m));
		m[0][0]=x,m[1][1]=1,m[1][0]=y;
	}
	matrix operator *(const matrix &a)const{
		matrix ans;
		for(int k=0;k<2;k++){
			for(int i=0;i<2;i++){
				for(int j=0;j<2;j++){
					ans.m[i][j]=(ans.m[i][j]+(m[i][k]*a.m[k][j]%p))%p;
				}
			}
		}
		return ans;
	}
	matrix operator ^(int b)const{
		matrix ans,a;ans.csh();
		for(int i=0;i<2;i++)for(int j=0;j<2;j++)a.m[i][j]=m[i][j];
		while(b){
			if(b&1)ans=ans*a;
			a=a*a;
			b>>=1;
		}
		return ans;
	}
}A,B,res;
int n,m,a,b,c,d;
signed main(){
	scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&a,&b,&c,&d);
	A.csh(a,b);B.csh(c,d);
	A=A^(m-1);B=A*B;B=B^(n-1);B=B*A;
	res.m[0][0]=res.m[0][1]=1;
	res=res*B;
	printf("%lld",(res.m[0][0]%p));
	return 0;
}


2022/7/4 21:15
加载中...