hdu 5015 233 Matrix 2014 ACM/ICPC Asia Regional Xi'an Online 矩阵快速幂

来源:互联网 发布:数据字典是用来定义 编辑:程序博客网 时间:2024/05/01 07:58

题目链接:hdu 5015

        给定一个递推的矩阵问第n行,第m列的元素是是什么。

       

        列出由第i列元素求得第i+1列元素的转移矩阵,然后利用矩阵快速幂求解

/****************************************************** * File Name:   1009.cpp * Author:      kojimai * Creater Time:2014年09月14日 星期日 14时34分23秒******************************************************//*   给定n,构造n+2*n+2的矩阵,乘一次该矩阵相当于通过当前列得到下一列,然后利用矩阵快速幂求出m次幂得到最终的转移矩阵,然后求解即可   矩阵如下      1 2 3 ...  n n+1 n+2   [  1   1 0 0 ...  0 10 1  2   1 1 0     0 10 1  3   1 1 1      0 10 1 ...  n   1 1 1 ...  1 10 1  n+1 0 0 0 ...  0 10 1  n+2 0 0 0 ...  0 0  1   ]   a(i,j)=a(i-1,0~j)+a(i,n+1)*10+a(i,n+2)*1   a(i,n+2)=3 */#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>using namespace std;long long lie[14];const long long mod= 10000007;struct node{long long num[14][14];}tmp,now;node mul(node a,node b,int n){node ret;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){ret.num[i][j]=0;for(int k=1;k<=n;k++){ret.num[i][j]=(ret.num[i][j]+a.num[i][k]*b.num[k][j]%mod)%mod;}}}return ret;}node qpow(int n,int d){node ret;memset(ret.num,0,sizeof(ret.num));for(int i=1;i<=n+2;i++)ret.num[i][i]=1;while(d){if(d%2==1)ret = mul(ret,tmp,n+2);tmp = mul(tmp,tmp,n+2);d/=2;}return ret;}void out(node x,int n){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)cout<<x.num[i][j]<<' ';cout<<endl;}return;}int main(){int n,m;while(~scanf("%d%d",&n,&m)){for(int i=1;i<=n;i++)cin>>lie[i];lie[n+1]=23;lie[n+2]=3;int j;memset(tmp.num,0,sizeof(tmp.num));for(int i=1;i<=n;i++){for(j=1;j<=i;j++){tmp.num[i][j]=1;}tmp.num[i][n+1]=10;tmp.num[i][n+2]=1;}tmp.num[n+1][n+1]=10;tmp.num[n+1][n+2]=1;tmp.num[n+2][n+2]=1;node x=qpow(n,m);//out(x,n+2);long long ans=0;for(int i=1;i<=n+2;i++){ans = (ans + lie[i]*x.num[n][i]%mod)%mod;}cout<<ans<<endl;}return 0;}


0 0