[蓝桥杯][算法提高VIP]递推求值

\[[F(n,1),F(n,2),F(n-1,1),F(n-1,2),F(n-2,1),F(n-2,2),1]=\\ [F(n-1,1),F(n-1,2),F(n-2,1),F(n-2,2),F(n-3,1),F(n-3,2),1] \begin{bmatrix} 0 & 1 & 1 & 0 & 0 & 0 & 0\\ 1 & 0 & 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 1 & 0\\ 2 & 3 & 0 & 0 & 0 & 0 & 0\\ 0 & 2 & 0 & 0 & 0 & 0 & 0\\ 5 & 3 & 0 & 0 & 0 & 0 & 1\\ \end{bmatrix} \\ =[F(3,1),F(3,2),F(2,1),F(2,2),F(1,1),F(1,2),1]\begin{bmatrix} 0 & 1 & 1 & 0 & 0 & 0 & 0\\ 1 & 0 & 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 1 & 0\\ 2 & 3 & 0 & 0 & 0 & 0 & 0\\ 0 & 2 & 0 & 0 & 0 & 0 & 0\\ 5 & 3 & 0 & 0 & 0 & 0 & 1\\ \end{bmatrix}^{n-3} \]

LL n;

void mul(int f[7],int m[7][7])
{
    int c[7]={0};
    for(int i=0;i<7;i++)
        for(int j=0;j<7;j++)
            c[i]=(c[i]+(LL)f[j]*m[j][i])%mod;
    memcpy(f,c,sizeof c);
}

void mulself(int m[7][7])
{
    int c[7][7]={0};
    for(int i=0;i<7;i++)
        for(int j=0;j<7;j++)
            for(int k=0;k<7;k++)
                c[i][j]=(c[i][j]+(LL)m[i][k]*m[k][j])%mod;
    memcpy(m,c,sizeof c);
}

int main()
{
    int f[7]={6,5,1,4,2,3,1};
    int m[7][7]={{0,1,1,0,0,0,0},
                 {1,0,0,1,0,0,0},
                 {0,0,0,0,1,0,0},
                 {0,0,0,0,0,1,0},
                 {2,3,0,0,0,0,0},
                 {0,2,0,0,0,0,0},
                 {5,3,0,0,0,0,1}};
    cin>>n;

    if(n == 1)
        cout<<2<<endl<<3<<endl;
    else if(n == 2)
        cout<<1<<endl<<4<<endl;
    else if(n == 3)
        cout<<6<<endl<<5<<endl;
    else
    {
        n-=3;
        while(n)
        {
            if(n & 1) mul(f,m);
            mulself(m);
            n>>=1;
        }

        cout<<f[0]<<endl<<f[1]<<endl;
    }
    //system("pause");
    return 0;
}
posted @ 2021-04-05 12:31  Dazzling!  阅读(38)  评论(0编辑  收藏  举报