dp[i][0/1] 后面 0或1表示最后一步走的还是跑的
dp[i][0] = dp[i-1][0] + dp[i-1][1] 走过来的就是前一步走的,加前一步跑的总方案数
dp[i][1] = dp[i-k][0] 跑过来的就是 前k步状态时走过来的方案 (前K步走的时候 然后再跑一步跑到当前状态)
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long ll;
const int maxn = 100005;
const int mod = 1000000007;
int q, k;
ll dp[maxn][2];
ll sum[maxn];
int main()
{
cin >> q >> k;
dp[0][0] = 1;
for(int i = 1;i < maxn;i ++)
{
dp[i][0] = (dp[i-1][0] + dp[i-1][1]) % mod;
if(i >= k)
{
dp[i][1] = dp[i-k][0];
}
sum[i] = sum[i-1] + dp[i][0] + dp[i][1];
sum[i] %= mod;
}
int l, r;
while(q --)
{
cin >> l >> r;
cout << (sum[r] - sum[l-1] + mod) % mod << endl;
}
return 0;
}