牛客多校第二場A
阿新 • • 發佈:2019-01-26
dp[i][0/1] 後面 0或1表示最後一步走的還是跑的
dp[i][0] = dp[i-1][0] + dp[i-1][1] 走過來的就是前一步走的,加前一步跑的總方案數
dp[i][1] = dp[i-k][0] 跑過來的就是 前k步狀態時走過來的方案 (前K步走的時候 然後再跑一步跑到當前狀態)
#include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; typedef long long ll; const int maxn = 100005; const int mod = 1000000007; int q, k; ll dp[maxn][2]; ll sum[maxn]; int main() { cin >> q >> k; dp[0][0] = 1; for(int i = 1;i < maxn;i ++) { dp[i][0] = (dp[i-1][0] + dp[i-1][1]) % mod; if(i >= k) { dp[i][1] = dp[i-k][0]; } sum[i] = sum[i-1] + dp[i][0] + dp[i][1]; sum[i] %= mod; } int l, r; while(q --) { cin >> l >> r; cout << (sum[r] - sum[l-1] + mod) % mod << endl; } return 0; }