转移方程:
dp[i][1] = dp[i - k][0]
dp[i][0] = dp[i - 1][0] + dp[i - 1][1]
其中0代表第到第i米是走过去的,1代表是跑过去的
然后再预处理一个前缀和就ok了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 1e9 + 7;
int dp[100100][2];
int ans[100100];
int main(){
int q, k;
scanf("%d%d", &q, &k);
int a, b;
dp[0][0] = 1;
for(int i = 1; i <= 100000; i ++){
if(i >= k)
dp[i][1] = dp[i - k][0] % M;
dp[i][0] = (dp[i - 1][0] % M + dp[i - 1][1] % M ) % M;
// cout << "debug " << i << ' ' << dp[i][0] << ' ' << dp[i][1] << endl;
}
for(int i = 1; i <= 100000; i ++){
ans[i] = (dp[i][0] % M + dp[i][1] % M + ans[i - 1] % M ) % M;
}
while(q --){
scanf("%d%d", &a, &b);
// cout << ans[a - 1] << ' ' << ans[b] << endl;
printf("%d\n", (ans[b] % M - ans[a - 1] % M + M) % M);
}
return 0;
}