DestinHistoire

 

HDU-5015 233 Matrix(构造+矩阵快速幂)

题目描述

  矩阵的第一行是 \(A[1][1]=0,A[1][2]=233,A[1][3]=2333,A[1][4]=23333,\cdots\),且 \(A[i][j]=A[i-1][j]+A[i][j-1]\)。现在给出 \(A[2][1],A[3][1],A[4][1],\cdots,A[n][1]\),求 \(A[n][m]\)

  数据范围:\(n\leq 10,m\leq 10^9,0\leq A[i][1]<2^{31}\)

分析

  首先由于 \(A[1][2]=233,A[1][3]=2333\),显然 \(A[1][i]=10\times A[1][i-1]+3(i\geq 2)\)

  如果令 \(A[1][1]=23\),则 \(A[1][i]=10\times A[1][i-1]+3(i\geq 1)\)

  把矩阵按列写出,尝试归纳规律:

  第一列:

\[\begin{bmatrix}23\\ A[2][1]\\ A[3][1]\\ \vdots\\ A[n-2][1]\\ A[n-1][1]\\ A[n][1]\end{bmatrix} \]

  第二列:

\[\begin{bmatrix}A[1][2]\\ A[2][2]\\ A[3][2]\\ \vdots\\ A[n-2][2]\\ A[n-1][2]\\ A[n][2]\end{bmatrix}= \begin{bmatrix}233\\ A[2][1]+233\\ A[3][1]+A[2][1]+233\\ \vdots\\ A[n-2][1]+A[n-3][2]\\ A[n-1][1]+A[n-2][1]+A[n-3][2]\\ A[n][1]+A[n-1][1]+A[n-2][1]+A[n-3][2]\end{bmatrix} \]

  将第二列变形:

\[\begin{bmatrix}A[1][2]\\ A[2][2]\\ A[3][2]\\ \vdots\\ A[n-2][2]\\ A[n-1][2]\\ A[n][2]\\ \end{bmatrix}= \begin{bmatrix}10\times A[1][1]+3\\ A[2][1]+10\times A[1][1]+3\\ A[3][1]+A[2][1]+10\times A[1][1]+3\\ \vdots\\ A[n-2][1]+A[n-3][1]+\cdots+A[3][1]+A[2][1]+10\times A[1][1]+3\\ A[n-1][1]+A[n-2][1]+A[n-3][1]+\cdots+A[3][1]+A[2][1]+10\times A[1][1]+3\\ A[n][1]+A[n-1][1]+A[n-2][1]+A[n-3][1]+\cdots+A[3][1]+A[2][1]+10\times A[1][1]+3\end{bmatrix} \]

  构造矩阵:

\[\begin{bmatrix}A[1][m]\\ A[2][m]\\ A[3][m]\\ A[4][m]\\ \vdots\\ A[n-2][m]\\ A[n-1][m]\\ A[n][m]\\ 3\end{bmatrix}= \begin{bmatrix}10&0&0&0&\cdots&0&0&0&1\\ 10&1&0&0&\cdots&0&0&0&1\\ 10&1&1&0&\cdots&0&0&0&1\\ 10&1&1&1&\cdots&0&0&0&1\\ \vdots&\vdots&\vdots&\vdots& &\vdots&\vdots&\vdots&\vdots\\ 10&1&1&1&\cdots&0&0&0&1\\ 10&1&1&1&\cdots&0&0&0&1\\ 10&1&1&1&\cdots&0&0&0&1\\ 0&0&0&0&0&0&0&0&1\\ \end{bmatrix} \begin{bmatrix}A[1][m-1]\\ A[2][m-1]\\ A[3][m-1]\\ A[4][m-1]\\ \vdots\\ A[n-2][m-1]\\ A[n-1][m-1]\\ A[n][m-1]\\ 3\end{bmatrix}= \begin{bmatrix}10&0&0&0&\cdots&0&0&0&1\\ 10&1&0&0&\cdots&0&0&0&1\\ 10&1&1&0&\cdots&0&0&0&1\\ 10&1&1&1&\cdots&0&0&0&1\\ \vdots&\vdots&\vdots&\vdots& &\vdots&\vdots&\vdots&\vdots\\ 10&1&1&1&\cdots&1&0&0&1\\ 10&1&1&1&\cdots&1&1&0&1\\ 10&1&1&1&\cdots&1&1&1&1\\ 0&0&0&0&0&0&0&0&1\\ \end{bmatrix}^m \begin{bmatrix}23\\ A[2][1]\\ A[3][1]\\ A[4][1]\\ \vdots\\ A[n-2][1]\\ A[n-1][1]\\ A[n][1]\\ 3\end{bmatrix} \]

代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int mod=10000007;
struct matrix
{
    long long mat[100][100];
    matrix(){
        memset(mat, 0, sizeof(mat));
    }
};
matrix mul(matrix A,matrix B)
{
    matrix ans;
    memset(ans.mat,0,sizeof(ans.mat));
    for(int i=1;i<=n+2;i++)
        for(int j=1;j<=n+2;j++)
            for(int k=1;k<=n+2;k++)
                ans.mat[i][j]=(ans.mat[i][j]+A.mat[i][k]*B.mat[k][j])%mod;
    return ans;
}
matrix matrix_pow(matrix a,int b)
{
    matrix ans;
    for(int i=1;i<=n+2;i++)
        for(int j=1;j<=n+2;j++)
            ans.mat[i][j]=(i==j);
    while(b)
    {
        if(b&1)
            ans=mul(ans,a);
        a=mul(a,a);
        b>>=1;
    }
    return ans;
}
int main()
{
    while(cin>>n>>m)
    {
        matrix A,B;
        A.mat[1][1]=23;
        for(int i=1;i<=n;i++)
            scanf("%d",&A.mat[i+1][1]);
        A.mat[n+2][1]=3;
        for(int i=1;i<=n+1;i++)
            B.mat[i][1]=10;
        B.mat[n+2][1]=0;
        for(int i=1;i<=n+2;i++)
            B.mat[i][n+2]=1;
        for(int i=1;i<=n+1;i++)
            for(int j=2;j<=i;j++)
                B.mat[i][j]=1;
        B=matrix_pow(B,m);
        matrix ans=mul(B,A);
        cout<<ans.mat[n+1][1]<<endl;
    }
    return 0;
}

posted on 2020-11-10 16:05  DestinHistoire  阅读(72)  评论(0)    收藏  举报

导航