矩阵乘法不满足交换律!!!!
20pts code:
#include<bits/stdc++.h>
#define Maxn 105
#define ll long long
using namespace std;
ll p, q, a1, a2, n, MOD;
struct Matrix{
ll a[Maxn][Maxn];
} A, Ans;
Matrix Times(Matrix a, Matrix b){
Matrix ans;
memset(ans.a, 0, sizeof(ans.a));
for(ll i=1;i<=2;i++){
for(ll j=1;j<=2;j++){
for(ll k=1;k<=2;k++){
ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%MOD;
}
}
}
return ans;
}
Matrix qpow(Matrix a, ll b){
Matrix res;
res.a[1][1]=1, res.a[1][2]=0;
res.a[2][1]=0, res.a[2][2]=1;
while(b){
if(b&1){ res=Times(res, a); }
a=Times(a, a);
b>>=1;
}
return res;
}
int main()
{
cin>>p>>q>>a1>>a2>>n>>MOD;
if(n==1){ cout<<a1%MOD; return 0; }
if(n==2){ cout<<a2%MOD; return 0; }
A.a[1][1]=p, A.a[1][2]=q;
A.a[2][1]=1, A.a[2][2]=0;
Ans.a[1][1]=a2%MOD;
Ans.a[2][1]=a1%MOD;
Ans=Times(Ans, qpow(A, n-2));
cout<<Ans.a[1][1];
return 0;
}
100pts code:
#include<bits/stdc++.h>
#define Maxn 105
#define ll long long
using namespace std;
ll p, q, a1, a2, n, MOD;
struct Matrix{
ll a[Maxn][Maxn];
} A, Ans;
Matrix Times(Matrix a, Matrix b){
Matrix ans;
memset(ans.a, 0, sizeof(ans.a));
for(ll i=1;i<=2;i++){
for(ll j=1;j<=2;j++){
for(ll k=1;k<=2;k++){
ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%MOD;
}
}
}
return ans;
}
Matrix qpow(Matrix a, ll b){
Matrix res;
res.a[1][1]=1, res.a[1][2]=0;
res.a[2][1]=0, res.a[2][2]=1;
while(b){
if(b&1){ res=Times(res, a); }
a=Times(a, a);
b>>=1;
}
return res;
}
int main()
{
cin>>p>>q>>a1>>a2>>n>>MOD;
if(n==1){ cout<<a1%MOD; return 0; }
if(n==2){ cout<<a2%MOD; return 0; }
A.a[1][1]=p, A.a[1][2]=q;
A.a[2][1]=1, A.a[2][2]=0;
Ans.a[1][1]=a2%MOD;
Ans.a[2][1]=a1%MOD;
Ans=Times(qpow(A, n-2), Ans);
cout<<Ans.a[1][1];
return 0;
}