1 solutions

  • 0
    @ 2025-11-5 17:01:52

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef vector<ll> vec;
    typedef vector<vec> mat;
    #define maxn 1000000007
    ll x,y,z,aa,b,c;
    mat mul(mat &a,mat &b)
    {
        mat c(a.size(),vec(b[0].size()));
        for (int i=0;i<a.size();i++){
            for (int k=0;k<b.size();k++){
                for (int j=0;j<b[0].size();j++){
                    c[i][j]=(c[i][j]+(a[i][k]*b[k][j])%maxn)%maxn;
                }
            }
        }
        return c;
    }
    mat pow(mat a,ll n)
    {
        mat b(a.size(),vec(a.size()));
        for (int i=0;i<a.size();i++){
            b[i][i]=1;
        }
        while(n>0){
            if (n&1) b=mul(b,a);
            a=mul(a,a);
            n>>=1;
        }
        return b;
    }
    ll solve(ll n)
    {
        mat a(3,vec(3));        //指定横纵坐标的大小
        a[0][0]=aa;a[0][1]=b;a[0][2]=c;
        a[1][0]=1;a[1][1]=0;a[1][2]=0;
        a[2][0]=0;a[2][1]=1;a[2][2]=0;
        a=pow(a,n);
        return ( (a[0][0]*x)%maxn + (a[0][1]*y)%maxn + (a[0][2]*z)%maxn )%maxn;
    }
    int main()
    {
        ll n;
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        while(~scanf("%lld",&n)){
            scanf("%lld%lld%lld%lld%lld%lld",&x,&y,&z,&aa,&b,&c);
            if (n==3){
                printf("%d\n",x);
                return 0;
            }
            if (n==2){
                printf("%d\n",y);
                return 0;
            }
            if (n==1){
                printf("%d\n",z);
                return 0;
            }
            printf("%lld\n",solve(n-3));
        }
        return 0;
    }
    
    
    • 1

    Information

    ID
    18167
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By