您的位置:首页 > 其它

hdu 5015 233 Matrix 矩阵优化

2016-09-23 17:33 411 查看
题意:

一个233矩阵的第一行为0,233,2333,23333,……233……3;第一列为 0,a[1],a[2],a[3]……a[k]对于其他位置的值满足matrix[i][j]=matrix[i-1][j]+matrix[i][j-1];

给你数组a[] 问matrix
[m]的值是什么

分析:

可以知道根据所给的规矩构造一个矩阵

10 0 0 0  的m次方的第n行和 矩阵  23   相乘就是所求的

10 1 0 0                                             a[1]

10 1 1 0                                             a[2]

 0   0 0  1                                             3

23 和 3 是添加为了构造233 2333的

ACcode:

#include <bits/stdc++.h>
#define mod 10000007
#define ll long long
using namespace std;
struct Matrix{
ll mat[12][12];
};
Matrix mul(Matrix a,Matrix b,int n){
Matrix ret;
for(int i=0;i<n+2;++i)
for(int j=0;j<n+2;++j){
ret.mat[i][j]=0;
for(int k=0;k<n+2;++k)
ret.mat[i][j]=(a.mat[i][k]*b.mat[k][j]+ret.mat[i][j])%mod;
}
return ret;
}
Matrix pow(Matrix a,int n,ll m){
Matrix ret;
memset(ret.mat,0,sizeof(ret.mat));
for(int i=0;i<n+2;++i)ret.mat[i][i]=1;
while(m){
if(m&1)ret=mul(ret,a,n);
a=mul(a,a,n);
m>>=1;
}
return ret;
}
int main(){
int n;
ll m,a[12];
while(cin>>n>>m){
a[0]=23;a[n+1]=3;
for(int i=1;i<=n;++i)cin>>a[i];
Matrix tmp;
memset(tmp.mat,0,sizeof(tmp.mat));
for(int i=0;i<n+1;++i)tmp.mat[i][0]=10;
for(int i=0;i<n+2;++i)tmp.mat[i][n+1]=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=i;++j)
tmp.mat[i][j]=1;
tmp=pow(tmp,n,m);
ll ans=0;
for(int i=0;i<n+2;++i)
ans=(ans+tmp.mat
[i]*a[i]+mod)%mod;
cout<<ans<<'\12';
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: