一个人可以走一步或者跳x步,但不能连着跳,问到这个区间里有几种走法
考虑两种状态 对于这一点,我可以走过来,前面是怎么样的我不用管,也可以跳过来但是,跳过来必须保证前一步是走的
dp[i][0]表示i这一步是走过来的dp[i][1]表示i这一步是跳过来的
#include<iostream> #include<bits/stdc++.h> using namespace std; long long dp[100002][2]; long long mod=1e9+7; long long ans[100002]; int main() { int n,w; cin>>n>>w; dp[0][0]=1; for(int i=1;i<=100002;i++) { dp[i][0]=(dp[i-1][0]+dp[i-1][1])%mod; if(i>=w) dp[i][1]=dp[i-w][0]%mod; } for(int i=1;i<=100002;i++) { ans[i]=(dp[i][0]+dp[i][1]+ans[i-1])%mod; } //for(int i=1;i<=10;i++) //cout<<ans[i]<<endl; while(n--) { long long l,r; cin>>l>>r; cout<<(ans[r]-ans[l-1]+mod)%mod<<endl; } return 0; }