通过画图可以发现,dp[i]可以从dp[i-1]走过来,或者dp[i-k]跑过来
因为不能连续跑,所以每次都要-1
前面几次都没有过,原因是忘记了取模!!!!!!!!(相加的时候取模,相间的时候就不必了,因为可能出现结果为负)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define Max int(1e5+10)
struct query
{
ll l,r;
}q[Max];
ll sum[Max],dp[Max];
int main()
{
ll p,k;
while(~scanf("%lld%lld",&p,&k))
{
ll ma=0,x,y;
for(int i=1;i<=p;i++)
{
scanf("%lld%lld",&x,&y);
ma=max(ma,y);
q[i].l=x;
q[i].r=y;
}
memset(dp,0,sizeof dp);
memset(sum,0,sizeof sum);
for(int i=1;i<k;i++)
{
dp[i]=1;
sum[i]=(sum[i-1]%1000000007+dp[i]%1000000007)%1000000007;
}
dp[k]=2;
sum[k]=(sum[k-1]%1000000007+2)%1000000007;
for(ll i=k+1;i<2*k;i++)
{
dp[i]=(dp[i-1]%1000000007+dp[i-k]%1000000007)%1000000007;
sum[i]=(sum[i-1]%1000000007+dp[i]%1000000007)%1000000007;
}
for(ll i=2*k;i<=ma;i++)
{
dp[i]=(dp[i-1]%1000000007+dp[i-k]%1000000007-1)%1000000007;
sum[i]=(sum[i-1]%1000000007+dp[i]%1000000007)%1000000007;
}
//for(int i=1;i<=ma;i++)
// cout<<dp[i]<<endl;
for(ll i=1;i<=p;i++)
printf("%lld\n",(sum[q[i].r]-sum[q[i].l-1]+1000000007)%1000000007);
}}