https://ac.nowcoder.com/acm/contest/140/A
题
意
:
q
次
查
询
,
每
秒
可
以
行
走
1
米
或
者
每
秒
跑
k
米
,
每
次
查
询
L
,
R
,
问
从
L
−
>
R
的
方
案
数
题意:q次查询,每秒可以行走1米或者每秒跑k米,每次查询L,R,问从L->R的方案数
题意:q次查询,每秒可以行走1米或者每秒跑k米,每次查询L,R,问从L−>R的方案数
(不能连续两秒都在跑步)
题 解 : 计 数 d p , d p [ i ] [ 0 ] 表 示 通 过 走 路 到 达 i 点 , d p [ i ] [ 1 ] 表 示 通 过 跑 步 到 达 i 点 题解:计数dp, dp[i][0]表示通过走路到达i点,dp[i][1]表示通过跑步到达i点 题解:计数dp,dp[i][0]表示通过走路到达i点,dp[i][1]表示通过跑步到达i点
d
p
[
i
]
[
0
]
可
以
从
d
p
[
i
−
1
]
[
0
]
和
d
p
[
i
−
1
]
[
1
]
转
移
过
来
dp[i][0]可以从dp[i-1][0]和dp[i-1][1]转移过来
dp[i][0]可以从dp[i−1][0]和dp[i−1][1]转移过来
d
p
[
i
]
[
1
]
只
能
从
d
p
[
i
−
k
]
[
0
]
转
移
过
来
,
与
d
p
[
]
[
1
]
无
关
,
因
为
不
能
连
续
的
几
秒
在
跑
步
dp[i][1]只能从dp[i-k][0]转移过来,与dp[][1]无关,因为不能连续的几秒在跑步
dp[i][1]只能从dp[i−k][0]转移过来,与dp[][1]无关,因为不能连续的几秒在跑步
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mem(a,b) memset(a,b,sizeof(a));
#define lowbit(x) x&-x;
#define debugint(name,x) printf("%s: %d\n",name,x);
#define debugstring(name,x) printf("%s: %s\n",name,x);
typedef long long ll;
typedef unsigned long long ull;
const double eps = 1e-6;
const int maxn = 1e5+5;
const ll mod = 1e9+7;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int q,k,L,R;
ll dp[maxn][3];
int main() {
cin>>q>>k;
mem(dp,0);
dp[0][0] = dp[0][1] = 0;
for(int i = 1; i <= 1e5; i++){
if(i < k) dp[i][0] = (dp[i-1][0] + 1)%mod;
else{
dp[i][0] = (dp[i-1][1]+dp[i-1][0]+1)%mod;
dp[i][1] = (dp[i-k][0] + 1)%mod;
}
}
while(q--){
scanf("%d%d",&L,&R);
printf("%lld\n",((dp[R][0]+dp[R][1])%mod-(dp[L-1][0]+dp[L-1][1])%mod+mod)%mod);
}
}