Codeforces Round #271 (Div. 2) D. Flowers (递推)
题目链接:http://codeforces.com/problemset/problem/474/D
用RW组成字符串,要求w的个数要k个连续出现,R任意,问字符串长度为[a, b]时,字符串的种类有多少。
递推,dp[i]表示长度为i的种类有多少。当i < k的时候 dp[i] = 1 , 当i == k的时候 dp[i] = 2 , 否则 dp[i] = dp[i - 1] + dp[i - k] 。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int MAXN = 1e5 + 10; 4 typedef __int64 LL; 5 LL mod = 1e9 + 7; 6 LL dp[MAXN] , ans[MAXN]; 7 int main() 8 { 9 int n , k , a , b; 10 scanf("%d %d" , &n , &k); 11 dp[0] = 1; 12 ans[0] = 0; 13 for(int i = 1 ; i <= 1e5 ; ++i) { 14 if(i >= k) 15 dp[i] = (dp[i - k] + dp[i - 1]) % mod; 16 else 17 dp[i] = 1; 18 ans[i] = (ans[i - 1] + dp[i]) % mod; 19 } 20 while(n--) { 21 scanf("%d %d" , &a , &b); 22 printf("%lld\n" , (ans[b] - ans[a - 1] + mod) % mod); 23 } 24 return 0; 25 }