一开始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;
}