dp状态不一定由i-1转移过来
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define mod 1000000007
#define eps 1e-8
#define N 100110
#define M 1001000
int n,m;
ll dp[N];
ll powMod(ll a,ll b)
{
ll ret = 1;
while(b)
{
if(b&1) ret = ret*a%mod;
a = a*a%mod;
b >>= 1;
}
return ret;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(dp,0,sizeof(dp));
dp[m] = 1;
for(int i=m+1;i<=n;i++)
{
dp[i] = 2*dp[i-1]%mod;
dp[i] = (dp[i]+(powMod(2,i-m-1)-dp[i-m-1]+mod)%mod)%mod;
}
printf("%lld\n",dp[n]);
}
}