1 条题解

  • 0
    @ 2025-4-14 18:43:48

    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

    信息

    ID
    3353
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者