快速幂

typedef long long ll;
const int LEN=3;

void sarray_cpy(int a[][LEN],int b[][LEN],int n){
    for(int i=0;i<n;i++){// a/b可以为同一个数组
        for(int j=0;j<n;j++) b[i][j]=a[i][j];
    }
}

void sarray_mul(int a[][LEN],int b[][LEN],int ret[][LEN],int n,int mod){
    static int c[LEN][LEN];// a/b/ret可以为同一个数组
    for(int i=0;i<n;i++) {
        for(int j=0;j<n;j++){
            c[i][j]=0;
            for(int k=0;k<n;k++){
                c[i][j]=(c[i][j]+1ll*a[i][k]*b[k][j])%mod;
            }
        }
    }
    sarray_cpy(c,ret,n);
}

void sarray_qpow(int aa[][LEN],ll b,int ret[][LEN],int n,int mod){
    static int a[LEN][LEN];// aa ret可以为同一个数组
    sarray_cpy(aa,a,n);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++) ret[i][j]=0;
        ret[i][i]=1;
    }
    while(b){
        if(b&1) sarray_mul(ret,a,ret,n,mod);
        sarray_mul(a,a,a,n,mod);
        b>>=1;
    }
}

void sarray_add(int a[][LEN],int b[][LEN],int c[][LEN],int n,int mod){
    for(int i=0;i<n;i++){// a,b,c可以为同一个数组
        for(int j=0;j<n;j++){
            c[i][j]=(a[i][j]+b[i][j])%mod;
        }
    }
}

// a^0 a^1 a^2 a^3 ... a^b
void sarray_sum(int a[][LEN],ll b,int ret[][LEN],int n,int mod){
    static int tmp[LEN][LEN];
    if(b==0) sarray_qpow(a,b,ret,n,mod);
    else{
        ll mid=(b-1)>>1;
        sarray_sum(a,mid,ret,n,mod);
        sarray_qpow(a,mid+1,tmp,n,mod);
        for(int i=0;i<n;i++) tmp[i][i]=(tmp[i][i]+1)%mod;
        sarray_mul(ret,tmp,ret,n,mod);
        if((b&1)==0) {
            sarray_mul(ret,a,ret,n,mod);
            for(int i=0;i<n;i++) ret[i][i]=(ret[i][i]+1)%mod;
        }
    }
}

int trans[LEN][LEN]={
    1,1,1,
    1,0,0,
    0,1,0
};

十进制矩阵快速幂

#include<bits/stdc++.h>
using namespace std;

void mul(const int a[2][2],const int b[2][2],int c[2][2],int mod){
    int res[2][2]={};
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            for(int k=0;k<2;k++) res[i][j]=(res[i][j]+1ll*a[i][k]*b[k][j])%mod;
        }
    }
    memcpy(c,res,sizeof(res));
}

void qpow(const int aa[2][2],int b,int c[2][2],int mod){
    int a[2][2]; memcpy(a,aa,sizeof(a));
    int res[2][2]={
            1,0,
            0,1
    };
    while(b){
        if(b&1) mul(res,a,res,mod);//res=1ll*res*a%mod;
        mul(a,a,a,mod);//a=1ll*a*a%mod;
        b>>=1;
    }
    memcpy(c,res,sizeof(res));
}

void qpow(const int aa[2][2],char*b,int ed,int c[2][2],int mod){
    int a[2][2]; memcpy(a,aa,sizeof(a));
    int res[2][2]={
            1,0,
            0,1
    };
    while(ed>=0){
        int t[2][2];
        qpow(a,b[ed]-'0',t,mod); mul(res,t,res,mod);//res=res*qpow(a,b[ed]-'0',mod);
        qpow(a,10,a,mod);
        ed--;// b/=10
    }
    memcpy(c,res,sizeof(res));
}

const int maxn=1e6+6;
char s[maxn];
int main(){
    int x0,x1,a,b,mod;
    scanf("%d%d%d%d%s%d",&x0,&x1,&a,&b,s,&mod);
    int trans[2][2]={
            a,b,
            1,0
    };
    int ans[2][2]={
            x1,0,
            x0,0
    };
    int trans2[2][2];
    qpow(trans,s,int(strlen(s))-1,trans2,mod);
    mul(trans2,ans,ans,mod);
    cout<<ans[1][0]<<endl;
}