Codeforces - 474D - Flowers

发布于 2024-05-08 05:12:31 字数 2079 浏览 20 评论 0

题目大意

Marmot 吃花,两种颜色红 R 和白 W,每次吃白花 W 都只能一次连续吃 k 朵,问在花的个数从 ab ( [a, b] ) 范围里,总共有多少种吃法。

解析

这题没有想出来,其实不难,一开始想到了前 [0,k) 肯定是 1 ,即 dp[0 ~ k-1] = 1 ,且 dp[k] = 2 ,但最后却没有想到 dp[i] 求法;

dp[i] 有两种来头:

  • dp[i-1] 上添加一朵红花;
  • dp[i-k] 上条件 k 朵白花;

所以 dp[i] = dp[i-1] + dp[i-k]

然后就是处理求和了,有一个要注意的地方,最后输出答案的时候,要注意输出是 (mod + sums[r] - sums[l-1])%mod ,因为如果上面取模其中, sum[l-1] < mod 且比较大,但 sum[r] > mod ,取模之后 sum[r] < sum[l] ,所以要先加上 mod

import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main {

    public static final long mod = 1000000007;
    public static final int MAX = 100005;

    public static void main(String[] args){
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        int t = cin.nextInt();
        int k = cin.nextInt();
        long[] dp = new long[MAX];
        long[] sums = new long[MAX];
        sums[0] = 0;
        for(int i = 1; i < k; i++){
            dp[i] = 1;
            sums[i] = (dp[i]%mod + sums[i-1]%mod)%mod;
        }
        dp[k] = 2;
        sums[k] = (dp[k]%mod + sums[k-1]%mod)%mod;
        for(int i = k+1; i < MAX; i++) {
            dp[i] = (dp[i-1]%mod + dp[i-k]%mod)%mod;
            sums[i] = (sums[i-1]%mod + dp[i]%mod)%mod;
        }
        for(int i = 0; i < t; i++){
            int l = cin.nextInt();
            int r = cin.nextInt();
//            System.out.println(sums[r] - sums[l-1]);  //err
//            System.out.println( (sums[r] - sums[l-1])%mod); //err
            System.out.println( (mod + sums[r] - sums[l-1])%mod);
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

比忠

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文