矩阵快速幂20pts求助
查看原帖
矩阵快速幂20pts求助
220824
yyz1005楼主2022/3/29 18:09

只 AC 了 #2#3,不知道哪里错了。

#include<bits/stdc++.h>
using namespace std;
long long MOD;//模数
//矩阵 
struct matrix{
	long long a[110][110];
	long long h,l;
	void MatrixInit(){
		memset(a,0,sizeof(a));
	}
	matrix operator *(const matrix &b) const{
		//矩阵乘法 
		matrix res;
		res.h = h;
		res.l = b.l;
		memset(res.a,0,sizeof(res.a));
		for(long long i = 1; i <= res.h; i++){
			for(long long j = 1; j <= res.l; j++){
				for(long long k = 1; k <= l; k++){
					res.a[i][j] += ((a[i][k]*b.a[k][j])%MOD);
					res.a[i][j]%=MOD;
				}
			}
		}
		return res;
	}
};
matrix MFP(matrix x,long long p){
	if(p==1) return x;
	matrix t = MFP(x,p>>1);
	if(p&1) return t*t*x;
	else return t*t;
}
matrix base;
int main(){
	matrix star;
	long long p,q,a1,a2,n,m;
	scanf("%lld%lld%lld%lld%lld%lld",&p,&q,&a1,&a2,&n,&MOD);
	//base
	//   |p,1|
	//   |q,0|
	//star:|a_2,a_1|->|a_3,a_2|->... 
	base.MatrixInit();
	base.h = 2;
	base.l = 2;
	base.a[1][1] = p;
	base.a[2][1] = q;
	base.a[1][2] = 1;
	base.a[2][2] = 0;
	
	star.h = 1;
	star.l = 2;
	star.a[1][1] = a2;
	star.a[1][2] = a1;
	
	if(n==1) printf("%lld",a1%MOD);//特判 
	else if(n==2) printf("%lld",a2%MOD);//特判 
	else {
		matrix ret = MFP(base,n-2);
		ret = ret*star;
		printf("%lld",ret.a[1][1]%MOD);
	}
	return 0;
}
2022/3/29 18:09
加载中...