【集训队作业2018】count
CSP后第一发Blog。
这道题没有一下子过掉,开始还推出了错的结论。在错误的生成函数里绕了好久……
很显然的转笛卡尔树,一个笛卡尔树对应一种序列。只要考虑一个笛卡尔树是否合法。
贪心地填数发现,从根到每一个叶子最多只能有 \(m - 1\) 个向左。
于是直接上生成函数。设 \(f_m(x)\) 为至多有 \(m\) 个向左的方案数,显然 \(f_m = x f_{m-1} f_m + 1\)。
解出 \(f_m = \frac{1}{1-x f_{m-1}}\),设 \(f_m = \frac{A_m}{B_m}\),可以列出线性递推。因为 \(B\) 每次最多乘 \(x\),次数不超过 \(n\),线性递推就可以使用点值来做到 \(O\left(n \log n\right)\)。
也可以转括号序列,多叉转二叉后变成栈高度不能超过 \(m\)。
左括号看做向上,右括号看做向右,那么就是有上下边界限制的网格图路径问题。
该问题比较特殊,只有 \(f\left(x\right) = x\) 和 \(f\left(x\right) = x + m\),可以通过设 \(f\left(x\right) = x\) 上方格子的 DP 值找规律归纳证明出 DP值的关系。
也可以直接容斥经过这两条边的情况。根据卡特兰数推导过程,我们可以把起点到 \(f\left(x\right) = x - 1\) 或 \(f\left(x\right) = x + m + 1\)轴对称,那么 新的点到终点的路径 对应着 原图中原点到终点经过这条边的路径。
多次翻折也类似。我们考虑经过两条线的情况,一定是交替的出现,所以容斥一下经过几次线就能算出答案。
总之做法很多。样例好评,注意坐标会爆int。
#include <bits/stdc++.h>
const int mod = 998244353;
const int MAXN = 200010;
typedef long long LL;
void reduce(int & x) { x += x >> 31 & mod; }
int mul(int a, int b) { return (LL) a * b % mod; }
int fac[MAXN], inv[MAXN];
int C(int a, LL b) {
return a < b || b < 0 ? 0 : (LL) fac[a] * inv[b] % mod * inv[a - b] % mod;
}
typedef std::pair<LL, LL> PII;
PII flip(PII x, LL b) { return PII(x.second - b, x.first + b); }
int n, m;
int main() {
std::ios_base::sync_with_stdio(false), std::cin.tie(0);
std::cin >> n >> m;
if (m > n) { std::cout << 0 << '\n'; return 0; }
fac[0] = fac[1] = inv[0] = inv[1] = 1;
for (int i = 2; i != MAXN; ++i) {
fac[i] = mul(fac[i - 1], i);
inv[i] = mul(inv[mod % i], mod - mod / i);
}
for (int i = 2; i != MAXN; ++i) inv[i] = mul(inv[i - 1], inv[i]);
PII a(0, 0), b(0, 0);
int ans = C(n * 2, n);
for (int i = 1, coef = 1; i <= n; ++i, coef = mod - coef) {
if (i & 1) a = flip(a, -1), b = flip(b, m + 1);
else a = flip(a, m + 1), b = flip(b, -1);
reduce(ans -= mul(coef, C(n * 2, n - a.first)));
reduce(ans -= mul(coef, C(n * 2, n - b.first)));
}
std::cout << ans << '\n';
return 0;
}
听说还有多边形限制网格图路径的题…… /px
【集训队作业2018】count的更多相关文章
- UOJ #449. 【集训队作业2018】喂鸽子
UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...
- [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥
题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...
- 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)
[UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
- UOJ#418. 【集训队作业2018】三角形
#418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...
- 2019.2.25 模拟赛T1【集训队作业2018】小Z的礼物
T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...
- [集训队作业2018]蜀道难——TopTree+贪心+树链剖分+链分治+树形DP
题目链接: [集训队作业2018]蜀道难 题目大意:给出一棵$n$个节点的树,要求给每个点赋一个$1\sim n$之内的权值使所有点的权值是$1\sim n$的一个排列,定义一条边的权值为两端点权值差 ...
- UOJ#422. 【集训队作业2018】小Z的礼物
#422. [集训队作业2018]小Z的礼物 min-max容斥 转化为每个集合最早被染色的期望时间 如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x 但是x会变,中途 ...
- UOJ#428. 【集训队作业2018】普通的计数题
#428. [集训队作业2018]普通的计数题 模型转化好题 所以变成统计有标号合法的树的个数. 合法限制: 1.根标号比子树都大 2.如果儿子全是叶子,数量B中有 3.如果存在一个儿子不是叶子,数量 ...
- uoj450 【集训队作业2018】复读机(生成函数,单位根反演)
uoj450 [集训队作业2018]复读机(生成函数,单位根反演) uoj 题解时间 首先直接搞出单个复读机的生成函数 $ \sum\limits_{ i = 0 }^{ k } [ d | i ] ...
随机推荐
- fiddler笔记:Composer选项卡
1.Composer选项卡介绍 Composer选项卡功能是可以手动构建和发送HTTP.HTTPS和FTP请求. 支持将Web Session列表中选中的Session拖入Composer选项卡,然后 ...
- python基础(十三)--os和sys模块
os模块 os.getpwd():获取当前工作目录(windows下没有) os.listdir(path):列出目录下的文件 os.remove(path):删出文件 (不能是目录,即文件夹) os ...
- WIndows系统BAT文件语法和技巧 原文的地址(http://www.jb51.net/article/5828.htm)
批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本 ...
- 牛客 128A 礼物 (组合计数)
大意: n种一元的奥利奥, m种2元的奥利奥, 求花恰好k元钱购买奥利奥的方案数. 可重组合问题, 直接dp即可. #include <iostream> #include <sst ...
- 数据库设计规范、E-R图、模型图
(1)数据库设计的优劣: 糟糕的数据库设计: ①数据冗余冗余.存储空间浪费. ②数据更新和插入异常. ③程序性能差. 良好的数据库设计 ①节省数据的存储空间. ②能够保证数据的完整新. ③方便进行数据 ...
- POJ 1860 汇率 SPFA
题意 有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0.39,那么你可以得到(100 - 0.39) * 29.75 = 2963.3975 ...
- C# 7.0 语法
C# 7.0的语法主要是优化了之前的写法,使得更加简洁方便.try catch when 这个使用场景很少,正常的开发无业务处理的时候不建议使用 . #region 2.字符串嵌入值 Console ...
- caffe训练时报错
转自:https://www.cnblogs.com/haiyang21/p/7614669.html F0717 :: math_functions.cu:] Check failed: statu ...
- springboot升级2.0 fastjson报错? 2.0以上应该怎么整合fastjson?
SpringBoot2.0如何集成fastjson?在网上查了一堆资料,但是各文章的说法不一,有些还是错的,可能只是简单测试一下就认为ok了,最后有没生效都不知道.恰逢公司项目需要将JackSon换成 ...
- kubernetes之pod调度
调度规则 deployment全自动调度: 运行在哪个节点上完全由master的scheduler经过一系列的算法计算得出, 用户无法进行干预 nodeselector定向调度: 指定pod调度到一些 ...