HDU 5015 233 Matrix (矩阵快速幂)

来源:互联网 发布:淘宝店铺起名软件 编辑:程序博客网 时间:2024/05/24 04:42

题目链接:HDU 5015 233 Matrix

题意:已知矩阵的第一行(可以递推出来)和第一列,其他ai,j = ai-1,j +ai,j-1,an,m



思路:写出先几个ai,j 根据矩阵乘法,得到构造矩阵


其中b1=233;


AC代码:

#include<stdio.h>#include<string.h>#define ll __int64const ll kmod=10000007;struct Matrix{ll m[15][15];};struct Matrix I,aa;ll n;void init(){ll i,j;memset(I.m,0,sizeof I.m);for(i=0;i<=14;i++)I.m[i][i]=1;memset(aa.m,0,sizeof aa.m);for(i=1;i<=14;i++){for(j=i;j<=14;j++)aa.m[i][j]=1;}aa.m[0][0]=1;aa.m[0][1]=3;aa.m[1][1]=10;}Matrix mul(Matrix a,Matrix b){ll i,j,k;Matrix c;for(i=0;i<n+2;i++){for(j=0;j<n+2;j++){c.m[i][j]=0;for(k=0;k<n+2;k++){c.m[i][j]+=(a.m[i][k]*b.m[k][j])%kmod;c.m[i][j]%=kmod;}}}return c;}Matrix quickpow(Matrix a,ll p){Matrix b,m;b=I,m=a;while(p){if(p%2) b=mul(b,m);p/=2;m=mul(m,m);}return b;}int main(){ll m;ll i,j,k;init();Matrix a,c;while(scanf("%I64d %I64d",&n,&m)!=EOF){a.m[0][0]=1,a.m[0][1]=233;for(i=2;i<n+2;i++)scanf("%I64d",&a.m[0][i]);Matrix ans;if(m==0){printf("%I64d\n",a.m[0][n+1]%kmod);continue;}ans=quickpow(aa,m);for(i=0;i<n+2;i++){c.m[0][i]=0;for(k=0;k<n+2;k++){c.m[0][i]+=(a.m[0][k]*ans.m[k][i])%kmod;c.m[0][i]%=kmod;}}printf("%I64d\n",c.m[0][n+1]%kmod);}return 0;}



0 0