1 条题解

  • 0
    @ 2025-4-14 18:41:37

    C++ :

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int n;
    const int mod=1000000007;
    struct Mat{
        long long m[6][6];
    };
    
    Mat mut(const Mat& a, const Mat& b)
    {
        Mat c;
        for(int i=0;i<6;i++)
        {
            for(int j=0;j<6;j++)
            {
                c.m[i][j]=0;
                for(int k=0;k<6;k++)
                {
                    c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mod;
                    c.m[i][j]%=mod;
                }
            }
        }
        return c;
    }
    
    Mat power(Mat a,long long p)
    {
        Mat ans;
        memset(ans.m,0,sizeof(ans.m));
        for(int i=0;i<6;i++)
        {
            ans.m[i][i]=1;
        }
        while(p)
        {
            if(p%2==0)
            {
                a=mut(a,a);
                p/=2;
            }
            else
            {
                ans=mut(ans,a);
                p--;
            }
        }
        return ans;
    }
    
    int main()
    {
       // freopen( "E.txt", "r", stdin );
       // freopen( "_E.txt", "w", stdout );
        while(cin>>n)
        {
            if(n==0)
                return 0;
    
            if(n==1)
            {
                cout<<1<<endl;
            }
            else if(n==2)
            {
                cout<<2<<endl;
            }
            else
            {
                Mat ans;
                memset(ans.m,0,sizeof(ans.m));
                ans.m[0][0]=ans.m[0][4]=ans.m[1][0]=ans.m[1][3]=ans.m[2][0]=ans.m[2][2]=1;
                ans.m[3][0]=ans.m[3][1]=ans.m[4][0]=ans.m[5][0]=ans.m[5][4]=ans.m[5][5]=1;
                ans.m[0][1]=ans.m[0][3]=ans.m[5][1]=ans.m[5][3]=4;
                ans.m[1][1]=ans.m[1][2]=3;
                ans.m[2][1]=2;
                ans.m[0][2]=ans.m[5][2]=6;
                ans=power(ans,n-2);
                long long res = 0;
                for(int i=0;i<5;i++) res+=ans.m[5][i];
                res+=ans.m[5][5]*2;
                cout<<res%mod<<endl;
            }
        }
        return 0;
    }
    
    • 1

    信息

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