构造矩阵b:
b[0]=233
b[1]=a[1]
b[2]=a[2]
b[3]=a[3]
......
b[n+1]=3
例如 样例3
b[0]=233
b[1]=23
b[2]=47
b[3]=16
b[4]=3
递推矩阵A,样例3
10 0 0 0 1
1 1 0 0 0
1 1 1 0 0
1 1 1 1 0
0 0 0 0 1
n+2阶方阵
A^m*b的第n项就是结果
代码:
//1046ms
#include
#include
#include
#include
using namespace std;
const int mod=10000007;
struct matrix
{
long long ma[13][13];
}a;
int n,m;
long long b[13];
matrix multi(matrix x,matrix y)//矩阵相乘
{
matrix ans;
memset(ans.ma,0,sizeof(ans.ma));
for(int i=0;i<=n+1;i++)
{
for(int j=0;j<=n+1;j++)
{
for(int k=0;k<=n+1;k++)
{
ans.ma[i][j]=(ans.ma[i][j]+x.ma[i][k]*y.ma[k][j])%mod;
}
}
}
return ans;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(a.ma,0,sizeof(a.ma));
b[0]=233;
for(int i=1;i<=n;i++)
{
scanf("%I64d",&b[i]);
}
b[n+1]=3;
a.ma[0][0]=10;//构造a矩阵
a.ma[0][n+1]=1;
a.ma[n+1][n+1]=1;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=i;j++)
{
a.ma[i][j]=1;
}
}
matrix ans;
memset(ans.ma,0,sizeof(ans.ma));
for(int i=0;i<=n+1;i++)//单位矩阵
{
for(int j=0;j<=n+1;j++)
{
if(i==j)
ans.ma[i][j]=1;
}
}
while(m)//矩阵快速幂
{
if(m&1)
{
ans=multi(ans,a);
}
a=multi(a,a);
m=(m>>1);
}
matrix mp;
memset(mp.ma,0,sizeof(mp.ma));
for(int i=0;i<=n+1;i++)//a的m次方与b矩阵相乘
{
for(int k=0;k<=n+1;k++)
{
mp.ma[i][0]=(mp.ma[i][0]+ans.ma[i][k]*b[k])%mod;
}
}
printf("%I64d\n",mp.ma[n][0]);
}
return 0;
}