题目链接: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 __int64
const 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;
}