牛客2018多校二 A-run (dp)

https://ac.nowcoder.com/acm/contest/140/A

题 意 : q 次 查 询 , 每 秒 可 以 行 走 1 米 或 者 每 秒 跑 k 米 , 每 次 查 询 L , R , 问 从 L − > R 的 方 案 数 题意:q次查询,每秒可以行走1米或者每秒跑k米,每次查询L,R,问从L->R的方案数 q1kL,RL>R
(不能连续两秒都在跑步)

题 解 : 计 数 d p , d p [ i ] [ 0 ] 表 示 通 过 走 路 到 达 i 点 , d p [ i ] [ 1 ] 表 示 通 过 跑 步 到 达 i 点 题解:计数dp, dp[i][0]表示通过走路到达i点,dp[i][1]表示通过跑步到达i点 dpdp[i][0]idp[i][1]i

d p [ i ] [ 0 ] 可 以 从 d p [ i − 1 ] [ 0 ] 和 d p [ i − 1 ] [ 1 ] 转 移 过 来 dp[i][0]可以从dp[i-1][0]和dp[i-1][1]转移过来 dp[i][0]dp[i1][0]dp[i1][1]
d p [ i ] [ 1 ] 只 能 从 d p [ i − k ] [ 0 ] 转 移 过 来 , 与 d p [ ] [ 1 ] 无 关 , 因 为 不 能 连 续 的 几 秒 在 跑 步 dp[i][1]只能从dp[i-k][0]转移过来,与dp[][1]无关,因为不能连续的几秒在跑步 dp[i][1]dp[ik][0],dp[][1]

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<cmath>
#include<map>
#include<set>
#include<vector> 
using namespace std;
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mem(a,b) memset(a,b,sizeof(a));
#define lowbit(x)  x&-x;  
#define debugint(name,x) printf("%s: %d\n",name,x);
#define debugstring(name,x) printf("%s: %s\n",name,x);
typedef long long ll;
typedef unsigned long long ull;
const double eps = 1e-6;
const int maxn = 1e5+5;
const ll mod = 1e9+7;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int q,k,L,R;
ll dp[maxn][3];
int main() {
    cin>>q>>k;
    mem(dp,0);
    dp[0][0] = dp[0][1] = 0;
    for(int i = 1; i <= 1e5; i++){
        if(i < k) dp[i][0] = (dp[i-1][0] + 1)%mod;
        else{
            dp[i][0] = (dp[i-1][1]+dp[i-1][0]+1)%mod;
            dp[i][1] = (dp[i-k][0] + 1)%mod;
        }
    }
    while(q--){
        scanf("%d%d",&L,&R);
        printf("%lld\n",((dp[R][0]+dp[R][1])%mod-(dp[L-1][0]+dp[L-1][1])%mod+mod)%mod);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值