40分 求助
查看原帖
40分 求助
467683
return_CE楼主2023/8/22 17:09
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll m,n;
ll p,q,a1,a2;

struct ju
{
	ll x[4][4];
}bass,ans,ret,ret2;

void init()
{
	bass.x[1][1]=p;bass.x[1][2]=1;bass.x[2][1]=q;
	ret.x[1][2]=1;ret.x[2][1]=q;ret.x[1][1]=p;
	ans.x[2][1]=a1;ans.x[1][1]=a2;
	ret2.x[2][1]=a1;ret2.x[1][1]=a2;
}

ll mul_bas()
{
	bass.x[1][1]=((ret.x[1][1]*ret.x[1][1])%m+(ret.x[1][2]*ret.x[2][1])%m)%m;
	bass.x[1][2]=((ret.x[1][1]*ret.x[1][2])%m+(ret.x[1][2]*ret.x[2][2])%m)%m;
	bass.x[2][1]=((ret.x[2][1]*ret.x[1][1])%m+(ret.x[2][2]*ret.x[2][1])%m)%m;
	bass.x[2][2]=((ret.x[2][1]*ret.x[1][2])%m+(ret.x[2][2]*ret.x[2][2])%m)%m;
	ret.x[1][1]=bass.x[1][1];ret.x[1][2]=bass.x[1][2];
	ret.x[2][1]=bass.x[2][1];ret.x[2][2]=bass.x[2][2];
}
ll mul_ans()
{
	ans.x[1][1]=((bass.x[1][1]*ret2.x[1][1])%m+(bass.x[1][2]*ret2.x[2][1])%m)%m;
	ans.x[2][1]=((bass.x[2][1]*ret2.x[1][1])%m+(bass.x[2][2]*ret2.x[2][1])%m)%m;
	ret2.x[1][1]=ans.x[1][1];ret2.x[2][1]=ans.x[2][1];
}
ll acce(ll y)
{
	while(y)
	{
		if(y&1)mul_ans();
		mul_bas();
		y/=2;
	}
	//return;
}
int main()
{
	cin>>p>>q>>a1>>a2>>n>>m;
//	p=p%m;q=q%m;a1=a1%m;a2=a2%m;
	if(n==1)
	{
		cout<<a1%m;
		return 0;
	}
	if(n==2)
	{
		cout<<a2%m;
		return 0;
	}
	init();
	acce(n-2);
	cout<<ans.x[1][1];
	return 0;
}
2023/8/22 17:09
加载中...