hdu 5015 Matrix 233 矩阵快速幂

来源:互联网 发布:淘宝开店实名认证照片 编辑:程序博客网 时间:2024/06/08 14:44

题目链接:点击打开链接

题意:一个233矩阵,当i,j>1时,值等于其上方元素加左方元素,求data[n][m]%mod;

思路:构造如下矩阵,


   1    0     0    0    0    0    0    0    0    0    0    0 

   1   10    0    0    0    0    0    0    0    0    0    0 

   1   10    1    0    0    0    0    0    0    0    0    0 

   1   10    1    1    0    0    0    0    0    0    0    0 

   1   10    1    1    1    0    0    0    0    0    0    0 

   1   10    1    1    1    1    0    0    0    0    0    0 

   1   10    1    1    1    1    1    0    0    0    0    0 

   1   10    1    1    1    1    1    1    0    0    0    0 

   1   10    1    1    1    1    1    1    1    0    0    0 

   1   10    1    1    1    1    1    1    1    1    0    0 

   1   10    1    1    1    1    1    1    1    1    1    0 

   1   10    1    1    1    1    1    1    1    1    1    1 


每次向后推一列

cpp:

#include <cstdio>#include <iostream>#include <queue>#include <cstring>#include <cmath>#define mod 10000007#define LL long longusing namespace std;struct Matrix{int n;int data[100][100];void set(int a,int b){n=a;memset(data,0,sizeof(data));if(b==1){for(int i=1;i<=n;i++){data[i][i]=1;}}}Matrix operator *(const Matrix& a) const{Matrix ret;ret.set(a.n,0);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int k=1;k<=n;k++){if(data[i][k]&&a.data[k][j]){ret.data[i][j]+=((LL)data[i][k]*a.data[k][j])%mod;}}ret.data[i][j]=(ret.data[i][j])%mod;}}return ret;}void print(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){printf("%d ",data[i][j]);}puts("");}}};Matrix pow_mod(int n,Matrix a){Matrix T=a,ret;ret.set(a.n,1);while (n){if(n&1) ret=ret*T;T=T*T;n/=2;}return ret;}int main (){int n,m;//freopen("data.in","r",stdin);while (~scanf("%d%d",&n,&m)){Matrix tp;tp.set(n+2,0);for(int i=1;i<=n+2;i++){for(int j=1;j<=i;j++){tp.data[i][j]=1;}tp.data[i][2]=10;}tp.data[1][2]=0;//tp.print();tp=pow_mod(m,tp);int temp[100]={0,3,23};for(int i=3;i<=n+2;i++){scanf("%d",temp+i);}int ans=0;for(int i=1;i<=n+2;i++){ans+=((LL)temp[i]*tp.data[n+2][i])%mod;}ans=(ans)%mod;printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击