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) 收藏 举报
浙公网安备 33010602011771号