#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define loop(i,a,b) for(int i=a;i pii; typedef vector vi; typedef vector vvi; typedef vector vp; typedef vector vvp; typedef vector vs; typedef vector vd; typedef vector vvd; typedef pair pip; typedef vectorvip; //#define mt make_tuple //typedef tuple tp; //typedef vector vt; const double PI=acos(-1); const double EPS=1e-7; const int inf=1e9; const ll INF=2e18; int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; #define MOD 1000000007 ll m; vvi mul(vvi A,vvi B){ vvi C(A.size(),vi(B[0].size())); rep(i,2)rep(j,m+1){ C[i][j]=(A[i][0]*B[0][j]%MOD+A[i][1]*B[1][j]%MOD)%MOD; } (C[0][m]+=A[0][m])%=MOD; (C[1][m]+=A[1][m])%=MOD; return C; } vvi pow(vvi A,ll n){ vvi B; bool h=false; while(n){ if(n&1){ if(h)B=mul(B,A); else B=A; h=true; } A=mul(A,A); n>>=1; } return B; } int main(){ ll n; cin>>n>>m; assert(1<=n&&n<=10000000000ll&&2<=m&&m<=30000); vi A(m+1,1); vvi B(2,vi(m+1,1)); A[m]=0;B[0][m-2]=2;B[1][m]=0; rep(i,m-2){ A[m-i-3]=(A[m-i-2]+A[m-i-1])%MOD; rep(j,2)B[j][m-i-3]=(B[j][m-i-2]+B[j][m-i-1])%MOD; } vvi out=pow(B,n); cout<<(A[0]*out[0][m]%MOD+A[1]*out[1][m]%MOD)%MOD<