首页 > 技术文章 > CodeForces 474.D Flowers

AOQNRMGYXLMV 2014-11-17 17:29 原文

题意:

有n朵花排成一排,小明要么吃掉连续的k朵白花,或者可以吃单个的红花。

给出一个n的区间[a, b],输出总吃花的方法数模 109+7 的值。

分析:

设d(i)表示吃i朵花的方案数。

则有如下递推关系:

d[i] = d[i-1] + d[i-k], (i ≥ k, d[0] = 1)

我们在计数i+1的情况时,可以分为如下两种情况:

  • 最后一朵是红花,方案数为d[i]
  • 最后k朵是白花,方案数为d[i-k]

然后预处理一下前缀和。

代码中注意取模。

 1 #include <cstdio>
 2 const int maxn = 100000 + 10;
 3 const int MOD = 1000000000 + 7;
 4 int d[maxn];
 5 
 6 int main()
 7 {
 8     int t, k, i;
 9     scanf("%d%d", &t, &k);
10 
11     d[0] = 1;
12     for(i = 1; i < k; ++i)    d[i] = 1;
13     for(; i < maxn; ++i)    d[i] = (d[i-1] + d[i - k]) % MOD;
14     
15     for(i = 1; i < maxn; ++i)    d[i] = (d[i] + d[i-1]) % MOD;
16     for(i = 0; i < t; ++i)
17     {
18         int a, b;
19         scanf("%d%d", &a, &b);
20         printf("%d\n", (d[b] - d[a-1] + MOD) % MOD);
21     }
22     
23     return 0;
24 }
代码君

 

推荐阅读