codeforces 474D 线性DP

codeforces 474D


题意:

给 定 t 和 k , 要 求 放 置 白 花 和 红 花 , 其 中 白 花 的 出 现 形 式 为 连 续 k 朵 。 给定t和k,要求放置白花和红花,其中白花的出现形式为连续k朵。 tkk
t 次 询 问 , 每 次 询 问 给 定 a 和 b , 问 区 间 [ a , b ] 上 符 合 要 求 的 排 花 方 案 数 。 t次询问,每次询问给定a和b,问区间[a,b]上符合要求的排花方案数。 tab[a,b]


题解:

d p [ i ] 表 示 长 度 为 i 的 排 花 方 案 数 , 用 s u m [ i ] 维 护 区 间 [ 1 , i ] 的 前 缀 和 。 dp[i]表示长度为i的排花方案数,用sum[i]维护区间[1,i]的前缀和。 dp[i]isum[i][1,i]
长 度 为 i − 1 时 , 右 边 放 置 1 朵 红 花 得 到 长 度 i 。 长度为i-1时,右边放置1朵红花得到长度i。 i11i
长 度 为 i − k 时 , 右 边 连 续 放 置 k 朵 白 花 得 到 长 度 i 。 长度为i-k时,右边连续放置k朵白花得到长度i。 ikki

  • d p [ i ] = ( d p [ i − 1 ] + d p [ i − k ] ) % m o d dp[i] = (dp[i-1]+dp[i-k])\%mod dp[i]=(dp[i1]+dp[ik])%mod

#include <bits\stdc++.h>
using namespace std;
const int mod = 1e9+7;
const int N = 100001;
long long sum[N];
long long dp[N];

int main() {
    int t, k, a, b;
    cin >> t >> k;
    for(int i = 0 ; i <= k ; i++){
        dp[i] = 1;
    }
    for(int i = k ; i < N ; i++){
        dp[i] = (dp[i-1]+dp[i-k])%mod;
    }
    for(int i = 1 ; i < N ; i++){
        sum[i] = (sum[i-1]+dp[i])%mod;
    }
    while(t--){
        cin >> a >> b;
        cout << (sum[b]-sum[a-1]+mod)%mod << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值