#include #include #include #include #include #define ll long long #define inf 1e9 #define eps 1e-10 #define md 1000000007 #define N 350 using namespace std; struct ju { ll a[N][N]; int x,y;} a,f,ans,mid; void operator * (ju &a,ju &b) { mid.x=a.x; mid.y=b.y; memset(mid.a,0,sizeof(mid.a)); for (int i=0;i<=a.x;i++) for (int j=0;j<=b.y;j++) for (int k=0;k<=a.y;k++) mid.a[i][j]=(mid.a[i][j]+a.a[i][k]*b.a[k][j])%md; a=mid; } void outit() { for (int i=0;i<=7;i++) { for (int j=0;j<=7;j++) printf("%d ",f.a[i][j]); printf("\n"); } } int main() { int tt,n,m; while (1) { if (scanf("%d%d",&n,&m)==EOF) break; memset(f.a,0,sizeof(f.a)); if (n>d)&1) { if (d!=0&& ((Si>>(d-1))&1) && ((Si>>d)&1)==0 && ((Sj>>(d-1))&1)==0 ) f.a[Si][Sj]=0; if (d!=m-1 && ((Si>>(d+1))&1) &&((Si>>d)&1)==0 && ((Sj>>(d+1))&1)==0) f.a[Si][Sj]=0; } } } //outit(); memset(a.a,0,sizeof(a.a)); a.a[0][0]=1; a.x=0; a.y=dd; memset(ans.a,0,sizeof(ans.a)); ans.x=ans.y=dd; for (int i=0;i<=ans.x;i++) ans.a[i][i]=1; while (n) { if (n&1) ans*f; f*f; n>>=1; } a*ans; ll sum=0; for (int i=0;i<=a.y;i++) sum=(sum+a.a[0][i])%md; printf("%I64d\n",sum); } return 0; }