状态转移方程
d[i] [1] 表示长度为i最后一个字母为W
d[i] [0] 表示长度为i最后一个字母为R
d[i] [1] = d[i-k] [1] + d[i-k] [0] ;
d[i] [0] = d[i-1] [1] + d[i-1] [0] ;
这两个可以合并起来
d[i] = d[i-1] + d[i-k] ;
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include<map>
#define pi acos(-1.0)
#define eps 1e-6
#define inf 1<<30
#define INF 1ll<<60
#define ll long long
#define MOD 1000000007
using namespace std;
ll d[101010];
ll s[101010];
int main()
{
int t,k;
cin>>t>>k;
for(int i=1;i<k;i++)
{
d[i]=1;
}
d[k]=2;
for(int i=k+1;i<=100000;i++)
d[i]=(d[i-1]+d[i-k])%MOD;
s[0]=0;
s[1]=d[1];
for(int i=2;i<=100000;i++)
{
s[i]=(s[i-1]+d[i]);
}
while(t--)
{
int a,b;
cin>>a>>b;
cout<<(s[b]-s[a-1])%MOD<<endl;
}
return 0;
}