@[lovely_hyzhuo](/user/716099) ~~太逊了~~我反正构造的原始矩阵是上下的,我也不知道你构造成 `b.v[1][1]=a2,b.v[1][2]=a1;` 咋做,我就是按徐老师上课讲的做的。最后答案是 `c.v[1][1]`。
```cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
int p,q,a1,a2,a,mod;
struct mat
{
int v[3][3];
mat()
{
memset(v,0,sizeof(v));
}
};
mat operator*(mat A,mat B)
{
mat C;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
C.v[i][j]=(C.v[i][j]+A.v[i][k]*B.v[k][j])%mod;
return C;
}
mat qpow(mat A,int x)
{
mat base;
for(int i=1;i<=2;i++)
base.v[i][i]=1;
while(x)
{
if(x&1)base=base*A;
A=A*A;
x>>=1;
}
return base;
}
signed main()
{
cin>>p>>q>>a1>>a2>>a>>mod;
mat A,B;
A.v[1][1]=p,A.v[1][2]=q;
A.v[2][1]=1,A.v[2][2]=0;
B.v[1][1]=a2,B.v[2][1]=a1;
if(a==1)cout<<a1%mod;
else if(a==2)cout<<a2%mod;
else
{
mat C=qpow(A,a-2)*B;
cout<<C.v[1][1];
}
return 0;
}
```
by Voluminousness @ 2023-11-12 22:35:21
[嗯](https://www.luogu.com.cn/discuss/739800)
by billtun @ 2023-12-01 20:02:22