经过多组数据实验发现,本蒟蒻的代码稳定在 k>30 的时候会WA
调了半天了,实在是调不动了QAQ
#include<cstdio>
#include<cstring>
#define int long long
const int mod=1e9+7;
const int maxn=105;
struct Matrix{
int n,m;
int c[maxn][maxn];
Matrix(int N=0,int M=0){
n=N,m=M;
memset(c,0,sizeof(c));
}
Matrix operator*(const Matrix a)const{
int l=n,r=a.m;
Matrix x=Matrix(l,r);
for(int i=1;i<=l;++i){
for(int j=1;j<=r;++j){
for(int k=1;k<=m;++k){
x.c[i][j]+=c[i][k]*a.c[k][j];
x.c[i][j]%=mod;
}
}
}
return x;
}
}A,B;
int n,k,x=4;
int f[45][45];
Matrix pow(Matrix&x,int b){
Matrix ans=Matrix(x.n,x.m);
for(int i=1;i<=x.m;++i)
ans.c[i][i]=1;
while(b){
if(b&1)
ans=x*ans;
x=x*x;
b>>=1;
}
return ans;
}
inline void init(void){
f[0][0]=1;
for(int i=1;i<=k;++i){
f[i][0]=1;
for(int j=1;j<=i;++j)
f[i][j]=(f[i-1][j-1]+f[i-1][j])%mod;
}
return;
}
signed main(){
scanf("%lld%lld",&n,&k);
init();
A=Matrix(1,3+(k<<1));
A.c[1][1]=1;A.c[1][2]=2;A.c[1][3]=1;
for(int i=1;i<=k;++i){
A.c[1][3+i]=1;
A.c[1][k+3+i]=x%mod;
x<<=1;
}
B=Matrix(3+(k<<1),3+(k<<1));
B.c[2][1]=1;
B.c[1][2]=B.c[2][2]=1;
B.c[3][3]=B.c[3+(k<<1)][3]=1;
for(int i=1;i<=k;++i){
B.c[1][i+k+3]=(1<<i)%mod;
B.c[3+k+i][3+i]=1;
B.c[2][3+i+k]=1;
}
for(int i=1;i<=k;++i){
for(int j=i;j<=k;++j){
B.c[3+i][3+k+j]=(((1<<j-i)%mod)*f[j][i])%mod;
B.c[3+k+i][3+k+j]=f[j][i];
}
}
// puts("Matrix-A:");
// for(int i=1;i<=2*k+3;++i)
// printf("%lld ",A.c[1][i]);
// puts("\nMatrix-B:");
// for(int i=1;i<=2*k+3;++i){
// for(int j=1;j<=2*k+3;++j)
// printf("%lld ",B.c[i][j]);
// puts("");
// }
A=A*pow(B,n-1);
printf("%lld",A.c[1][3]);
return 0;
}