题意
如题- 分析
二项式展开递推公式,构造矩阵。关于矩阵快速幂的一般情况,请看Luo神的这篇文章。Latex的矩阵太难写了。。。
请看Acdreamers大佬的分析 - 代码
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
typedef vector<ll> vec;
typedef vector<vec>mat;
const ll mod=1e9+7;
ll n,C[45][45];
int k;
void init()
{
for(int i=0;i<44;i++)
{
C[i][0] = C[i][i] = 1;
if(i == 0) continue;
for(int j=1;j<=i;j++)
C[i][j] = (C[i-1][j] % mod + C[i-1][j-1] % mod) %mod;
}
}
mat mul(mat &A,mat &B)
{
mat C(A.size(),vec(B[0].size()));
for(int i=0;i<A.size();++i){
for(int k=0;k<B.size();++k){
for(int j=0;j<B[0].size();++j)
C[i][j]=(C[i][j]+A[i][k]%mod*B[k][j]%mod)%mod;
}
}
return C;
}
mat qpow(mat A,ll n)
{
mat B(A.size(),vec(A.size()));
for(int i=0;i<A.size();++i)
B[i][i]=1;
while(n>0){
if(n&1) B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}
int main()
{
init();
scanf("%lld%d",&n,&k);
int len=2*k+3;
mat a(len,vec(len));
a[0][0]=1;
for(int i=1;i<=k+1;++i)
a[0][i]=a[0][i+k+1]=C[k][k+1-i];
for(int i=1;i<=k+1;++i)
for(int j=i;j<=k+1;++j)
a[i][j]=a[i][j+k+1]=C[k+1-i][k+1-j];
for(int i=k+2;i<len;++i)
for(int j=i-k-1;j<=k+1;++j)
a[i][j]=C[k+k+2-i][k+1-j];
a=qpow(a,n-1);
ll ans=0;
for(int i=0;i<len;++i)
ans=(ans+a[0][i])%mod;
printf("%lld\n",ans);
return 0;
}