记录编号 577974 评测结果 AAAAAAAAAA
题目名称 [SRM 377] 外星语言 最终得分 100
用户昵称 Gravatarop_组撒头屯 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2023-01-03 08:33:04 内存使用 0.00 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pii pair<int,int>
#define vi vector<int>
#define si set<int>
#define qi queue<int>
#define sti stack<int>
#define fi first
#define se second
#define pb push_back
const int N=5;
ll p,q,n=3,m,mod;
struct sdf{
	ll p[N][N];
	sdf(){
		for (int i=1;i<=n;i++){
			for (int j=1;j<=n;j++)p[i][j]=0;
		}
	}
	sdf operator*(const sdf&x)const{
		sdf tmp;
		for (int i=1;i<=n;i++){
			for (int j=1;j<=n;j++){
				for (int k=1;k<=n;k++){
					tmp.p[i][j]=(tmp.p[i][j]+p[i][k]*x.p[k][j]%mod)%mod;
				}
			}
		}
		return tmp;
	}
}A,B,C,id,mp;
void fst(int x){
	if (!x){
		B=id;return ;
	}
	if (x&1){
		fst(x-1);B=B*A;return ;
	}
	else{
		fst(x/2);B=B*B;return ;
	}
}
ll calc(ll x){
	A=B=C;
	A.p[1][1]=1;
	A.p[1][3]=A.p[2][3]=2*x;
	A.p[1][2]=A.p[2][2]=A.p[2][3]=A.p[3][3]=x;
	fst(m);
	return B.p[1][3];
}
int main(){
	freopen ("alienlanguage.in","r",stdin);
	freopen ("alienlanguage.out","w",stdout);
	scanf("%lld%lld%lld%lld",&p,&q,&m,&mod);
	for (int i=1;i<=n;i++)id.p[i][i]=1;
	ll x=calc(p),y=calc(q);
	printf("%lld\n",(x*y%mod+x+y)%mod);
	return 0;
}