40pts求助矩阵加速
查看原帖
40pts求助矩阵加速
409774
Maysoul楼主2023/7/26 19:37

一开始20pts,后来交换a1,a2位置之后变成40pts

感觉思路应该是没问题的,不懂求教

//2023/7/26
//别着急,先通读一遍题目
//别忘了开long long
//写完先看一遍怎么降复杂度
//要么开全局变量要么给定初值
//想想看,有什么情况需要特判
//看看数组开的够不够大
//std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int MAXN=1e3+10;
int n,k;
int p,q,a1,a2,m;
struct juz{
	int a[2][2];
	juz(){memset(a,0,sizeof(a));}
	void build(){
		for (int i=1;i<=n;i++) a[i][i]=1;
	}
	juz friend operator * (juz &x,juz &y){
		juz t;
		for (int i=0;i<2;i++){
			for (int k=0;k<2;k++){
				for (int j=0;j<2;j++){
					t.a[i][j]=(t.a[i][j]+x.a[i][k]*y.a[k][j])%m;
				}
			}
		}
		return t;
	}
}data;
juz ans;
void init()
{
	data.a[0][0]=p;
	data.a[0][1]=q;
	data.a[1][0]=1;
	ans.a[0][0]=a2;
	ans.a[0][1]=a1;
}
void qpow(int k)
{
	while(k>0){
		if(k&1)	ans=ans*data;
		data=data*data;
		k>>=1;
	}
}
signed main()
{
	cin>>p>>q>>a1>>a2>>n>>m;
	if(n==1){
		cout<<a1<<endl;
		return 0;
	}
	if(n==2){
		cout<<a2<<endl;
		return 0;
	}
	init(); 
	qpow(n-2);
	cout<<ans.a[0][0]<<endl;
	return 0;
}

2023/7/26 19:37
加载中...