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
" , (ans[b] - ans[a - 1] + mod) % mod);
23     }
24     return 0;
25 }
原文地址:https://www.cnblogs.com/Recoder/p/5541831.html