http://acm.hdu.edu.cn/showproblem.php?pid=5015
题意:
各一个n*m的矩阵(n<=10,m<10^9),求矩阵中的Matrix[n][m]的值。
矩阵的构造是这样的Matrix[i+1][j+1]=Matrix[i+1][j-1]+Matrix[i][j+1]构成的.Matrix[0][j]=23...3,Matrix[i][0]=ai;
由于具有递推性质,那么可以构造一个矩阵,用矩阵快速幂来解题。
构造的矩阵M为(红色矩形中):
右边的行列式b为:
由于递推的关系,可得最后的结果为:
M^m的最后一列和b相乘的解,即为所求。
#include<stdio.h>
#define LL long long int
#define mod 10000007
using namespace std;
struct Node {
LL a[20][20];
} Matrix,tempans;
LL R_Determinant[20];
void init(int n) {
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
Matrix.a[i][j]=0;
Matrix.a[0][0]=1;
Matrix.a[1][0]=3;
Matrix.a[1][1]=10;
for(int i=2; i<n; i++) {
for(int j=1; j<=i; j++) {
Matrix.a[i][j]=1;
}
}
}
Node Matrix_Mul(Node &A ,Node &B,int n) {
int i,j,k;
Node f;
for(int i=0; i<20; i++)
for(int j=0; j<20; j++)
f.a[i][j]=0;
for(i=0; i<n; i++) {
for(k=0; k<n; k++) {
if(A.a[i][k]==0)continue;
for(j=0; j<n; j++) {
f.a[i][j]=(f.a[i][j]+A.a[i][k]*B.a[k][j])%mod;
}
}
}
return f;
}
Node Matrix_quickpow(LL n,LL p) {
Node tempans;
for(int i=0; i<20; i++)
for(int j=0; j<20; j++)
tempans.a[i][j]=0;
for(int i=0; i<n; i++) {
tempans.a[i][i]=1;
}
while(p) {
if(p & 1)
tempans = Matrix_Mul(tempans,Matrix,n+2);
p = p >> 1;
Matrix = Matrix_Mul(Matrix , Matrix,n+2);
}
return tempans;
}
int main() {
LL n,m;
R_Determinant[0]=1;
R_Determinant[1]=233;
while(~scanf("%I64d %I64d",&n,&m)) {
for(int i=2; i<n+2; i++) {
scanf("%I64d",&R_Determinant[i]);
}
for(int i=0;i<n+2;i++){
printf("%I64d\n",R_Determinant[i]);
}
init(n+2);
Node ans_Matrix=Matrix_quickpow(n+2,m);
LL ans=0;
for(int i=0;i<n+2;i++){
ans=(ans+(ans_Matrix.a[n+1][i]*R_Determinant[i])%mod)%mod;
}
printf("%I64d\n",ans);
}
return 0;
}