题目链接:点击打开链接
题意:一个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 long
using 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;
}