题意:

给你六个个数字
取余

思路:

求广义斐波那契数列的第项,因为比较大,需要去找循环节,或者二进制转十进制运算,后者不注意容易T,但是我只会十进制,广义斐波那契数列的循环节是神仙找的规律。类比二进制的快速幂,有如下例子:


,则:
1、
2、
3、
4、

MyCode:

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
inline ll read() {
    ll s = 0, w = 1;
    char ch = getchar();
    while (ch < 48 || ch > 57) {
        if (ch == '-') w = -1;
        ch = getchar();
    }
    while (ch >= 48 && ch <= 57)
        s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
    return s * w;
}
int mod;
char str[1000007];
struct node {
    ll mat[2][2];
    node() {
        memset(mat,0,sizeof mat);
    }
    void one() {
        mat[0][0]=mat[1][1]=1;
    }
    node operator*(node other) {
        node res;
        for(int i=0; i<2; ++i)
            for(int j=0; j<2; ++j)
                for(int k=0; k<2; ++k) {
                    res.mat[i][j]+=mat[i][k]*other.mat[k][j];
                    res.mat[i][j]%=mod;
                }
        return res;
    }
};
inline node power(node a,int b) {
    node res;
    res.one();
    while(b) {
        if(b&1) res=res*a;
        a=a*a;
        b>>=1;
    }
    return res;
}
node qpow(node a,int b) {
    node res;
    res.one();
    for(int i=b-1; ~i; --i) {
        res=res*power(a,str[i]-'0');
        node tmp=a*a;
        tmp=tmp*tmp*a;
        a=tmp*tmp;
    }
    return res;
}
int main() {
    int len,x0=read(),x1=read(),a=read(),b=read();
    scanf("%s%d",str,&mod);
    len=strlen(str);
    for(int i=len-1; ~i; --i) {
        if(str[i]=='0') str[i]='9';
        else {
            --str[i];
            break;
        }
    }
    node tmp;
    tmp.mat[0][0]=a;
    tmp.mat[1][0]=b;
    tmp.mat[0][1]=1;
    node ans=qpow(tmp,len);
    printf("%lld\n",((x1*ans.mat[0][0]%mod)+(x0*ans.mat[1][0]%mod))%mod);
}