题目链接

Just Jump

题意

有L+1个点,初始在第0个点上,要跳到第L个点,每次至少跳d格,也就是在点x至少要跳到x+d,且有m个限制

\((t_i, p_i)\)指跳第\(t_i\)次不能跳到\(p_i\)上

题解

设dp[i]表示从0跳到i且没有限制的方案数,可以预处理。对限制按t从小到大排序,\(g[i][0]\)表示通过了前i-1个限制,踩在了第i个限制上且1-i这些限制踩了偶数个,\(g[i][1]\)表示踩了奇数个限制的方案数,可以\(m^2\)递推,根据容斥原理加上踩偶次的方案数扣掉踩奇数次的方案数。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int mx = 1e7+5;
const int mod = 998244353;
ll dp[mx], fac[mx], invf[mx];
int g[3005][2];
int L, d, m; int pow_mod(ll a, ll b) {
ll ans = 1;
while (b > 0) {
if (b & 1) ans = ans * a % mod;
a = a * a % mod;
b /= 2;
}
return ans;
} struct Node {
int t, p;
bool operator < (Node other) const {
return t < other.t;
}
}node[3005]; int C(int x, int y) {
if (x < y || y < 0 || x < 0) return 0;
return (1LL * fac[x] * invf[y] % mod * invf[x-y]) % mod;
} int calc(int i, int j) {
if (1LL * (node[j].t-node[i].t)*d > node[j].p-node[i].p) return 0;
return C(node[j].p-node[i].p-(node[j].t-node[i].t)*d + (node[j].t-node[i].t) - 1, node[j].t-node[i].t-1);
} int main() {
scanf("%d%d%d", &L, &d, &m);
for (int i = 1; i <= m; i++) scanf("%d%d", &node[i].t, &node[i].p);
sort(node+1, node+1+m);
node[0].t = node[0].p = 0;
dp[0] = 1;
int sum = 0;
for (int i = 1; i <= L; i++) {
if (i-d >= 0) sum = (sum + dp[i-d]) % mod;
dp[i] = sum;
} fac[0] = invf[0] = 1;
for (int i = 1; i <= L; i++) fac[i] = 1LL * fac[i-1] * i % mod;
invf[L] = pow_mod(fac[L], mod-2);
for (int i = L-1; i >= 1; i--) invf[i] = 1LL * invf[i+1] * (i+1) % mod; g[0][0] = 1; g[0][1] = 0;
for (int i = 1; i <= m; i++) {
for (int j = 0; j < i; j++) {
g[i][0] = (g[i][0] + 1LL * g[j][1] * calc(j, i) % mod) % mod;
g[i][1] = (g[i][1] + 1LL * g[j][0] * calc(j, i) % mod) % mod;
}
}
ll ans = dp[L];
for (int i = 1; i <= m; i++) {
ans += 1LL * (g[i][0] - g[i][1]) * dp[L-node[i].p] % mod;
ans = (ans % mod + mod) % mod;
}
printf("%lld\n", ans);
return 0;
}

I-Just Jump_2019牛客暑期多校训练营(第八场)的更多相关文章

  1. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  2. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  3. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  4. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  5. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  6. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  7. [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem

    链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  8. 2019牛客暑期多校训练营(第二场)J-Subarray(思维)

    >传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...

  9. J-Subarray_2019牛客暑期多校训练营(第二场)

    题意 有一个只由1,-1组成的数组,给出所有连续的1所在位置,求满足1的个数大于-1的个数的子区间的数量 题解 参考博客:https://www.cnblogs.com/Yinku/p/1122149 ...

随机推荐

  1. abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十一)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  2. Activiti6系列(3)- 快速体验

    一.部署启动activiti 1.部署,将两个war包拷贝到Tomcat下即可. 2.启动tomcat,访问http://127.0.0.1:8080/activiti-app 默认账号密码:admi ...

  3. C#使用代理IP发送请求

    https://www.cnblogs.com/benbenfishfish/p/5830149.html   获取可代理的IP https://www.cnblogs.com/ShalenChe/p ...

  4. hadoop学习(五)----HDFS的java操作

    前面我们基本学习了HDFS的原理,hadoop环境的搭建,下面开始正式的实践,语言以java为主.这一节来看一下HDFS的java操作. 1 环境准备 上一篇说了windows下搭建hadoop环境, ...

  5. byte数组和正数BigInteger之间的相互转换

    旧代码 public static void main(String[] args) { SecureRandom random = new SecureRandom(); byte[] key = ...

  6. charles(version4.2.1)抓包手机数据

    点击菜单栏的Proxy项,选择Proxy Settings. 设置HTTP Proxy的Port. 勾选透明代理Enable transparent HTTP proxying,也可不勾选. 设置代理 ...

  7. Linux lsof工具介绍

    引言 在<Linux fuser工具介绍>一文中,与大家一起学习了fuser工具的使用方法."lsof"——list open files,lsof也是Linux下用于 ...

  8. pythonday03数据类型(一)

    今日内容 1.整型 2.布尔型 3.字符串 4.补充 5.作业讲解 6,pycharm自动生成头文件 1.整型(int) py2 int/long 32位电脑:-2147483648-21474836 ...

  9. 解决微信二次分享失败--后面被加上from=singlemessage&isappinstalled=0的解决方案

    首次分享成功,点开后再次分享或第三次分享就失败了 1.检查你分享的链接,看是否多了两个参数,微信分享会根据分享的不同,为原始链接拼接: 朋友圈   from=timeline&isappins ...

  10. Java虚拟机详解(六)------内存分配

    我们说Java是自动进行内存管理的,所谓自动化就是,不需要程序员操心,Java会自动进行内存分配和内存回收这两方面. 前面我们介绍过如何通过垃圾回收器来回收内存,那么本篇博客我们来聊聊如何进行分配内存 ...