洛谷 P6672 - [清华集训2016] 你的生命已如风中残烛(组合数学)
题解里一堆密密麻麻的 Raney 引理……蒟蒻表示看不懂,因此决定写一篇题解提供一个像我这样的蒟蒻能理解的思路,或者说,理解方式。
首先我们考虑什么样的牌堆顺序符合条件。显然,在摸牌任意时刻,你手中的牌允许你继续无限制摸的牌是一段区间,即存在一个位置 \(p\),满足你在不使用新摸出来的牌的机会下能够恰好摸到第 \(p\) 张牌。考虑如果我们新摸出来一张牌会产生怎样的影响,假设摸出一张 \(w_i=x\) 的牌,那么我们肯定会在耗完目前手中牌的机会,也就是摸完第 \(p\) 张牌后使用该牌,这样我们恰好会在摸第 \(p+1,p+2,\cdots,p+x\) 张牌时使用这张牌摸牌的机会。因此我们考虑将原问题转化为一个区间覆盖的问题,一个点覆盖了即意味着该点能够被摸到,考虑这样的过程:
Process:我们从左到右扫一遍,如果扫到一个 \(w_i>0\) 的点,就在该点后面找到距离该点最近的一段长度为 \(w_i\) 且区间中所有点都没有被覆盖的区间,并将这段区间所有点都设为被覆盖,那么一个牌堆符合条件当且仅当不存在某个 \(\le m\) 的位置没有被覆盖。
这个过程看起来有点鸡肋,我们考虑稍微变换一下,我们不一定要覆盖完整的区间,我们只需要向后找到 \(w_i\) 个没有覆盖的点并将它们设为被覆盖即可,不难发现这样不合法的情况,在我们新的过程中依然不合法,原来合法的情况依旧合法。
这样还是不好直接维护,不过思路理到这一步,做过 CF838D Airplane Arrangements 的同学们应该会感到特别熟悉。没错,这道题和那道题安排飞机座位的过程是完全一致的。按照那题的套路,我们在后面补上一个 \(m+1\) 号点,并将这个问题放到一个环上,那么一个牌堆符合条件当且仅当第 \(m+1\) 个位置没有被占用。不难发现由于没有被占用的位置只有一个,因此我们考虑做这样一个变换:将牌堆沿着环按顺时针方向分别旋转 \(1,2,3,\cdots,m\),那么由于环的对称性,对于一个合法的牌堆,在这些变换后的牌堆中,空着的位置分别是 \(1,2,3,\cdots,m\),也就是说全部 \(m+1\) 个位置是等价的,因此我们只用拿总方案数除以 \(m+1\) 即可。那么怎么计算总方案数呢?\(m!\)?Nope。由于我们引入了一个 \(m+1\) 位置,因此我们也要相应地添上一个 \(0\),因此总共 \((m+1)!\) 种可能,但由于我们新增的 \(0\) 与其他 \(0\) 并没有区别,也即,所有 \(0\) 都可以充当这个新增的 \(0\),对于每个合法的牌堆我们答案重复计算了 \(m-n+1\) 次,因此答案还需除以 \(m-n+1\)。
于是
\]
#include <cstdio>
using namespace std;
const int MOD=998244353;
int n,m,res=1;
int main(){
scanf("%d",&n);
for(int i=1,x;i<=n;i++) scanf("%d",&x),m+=x;
for(int i=1;i<=m;i++) if(i^(m-n+1)) res=1ll*res*i%MOD;
printf("%d\n",res);
return 0;
}
洛谷 P6672 - [清华集训2016] 你的生命已如风中残烛(组合数学)的更多相关文章
- UOJ273 [清华集训2016] 你的生命已如风中残烛 【数学】
题目分析: 把$0$卡牌看成$-1$.题目要求前缀和始终大于等于$1$. 最后添加一个$-1$,这样除了最后一位之外大于等于1,最后一位等于0. 构造圆排列.这样的话一个圆排列只有一个满足的情况,然后 ...
- 洛谷 P6667 - [清华集训2016] 如何优雅地求和(下降幂多项式,多项式)
题面传送门 wjz:<如何优雅地 AK NOI> 我:如何优雅地爆零 首先,按照这题总结出来的一个小套路,看到多项式与组合数结合的题,可以考虑将普通多项式转为下降幂多项式,因为下降幂和组合 ...
- P6672-[清华集训2016]你的生命已如风中残烛【结论】
正题 题目链接:https://www.luogu.com.cn/problem/P6672 题目大意 长度为\(m\)的序列\(a\),有\(n\)个数字不是\(0\),其他\(m-n\)个是\(0 ...
- 洛谷 P2260 [清华集训2012]模积和 || bzoj2956
https://www.lydsy.com/JudgeOnline/problem.php?id=2956 https://www.luogu.org/problemnew/show/P2260 暴力 ...
- 洛谷P2260 [清华集训2012]模积和(容斥+数论分块)
题意 https://www.luogu.com.cn/problem/P2260 思路 具体思路见下图: 注意这个模数不是质数,不能用快速幂来求逆元,要用扩展gcd. 代码 #include< ...
- 洛谷 P4002 - [清华集训2017]生成树计数(多项式)
题面传送门 神题. 考虑将所有连通块缩成一个点,那么所有连好边的生成树在缩点之后一定是一个 \(n\) 个点的生成树.我们记 \(d_i\) 为第 \(i\) 个连通块缩完点之后的度数 \(-1\), ...
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
#274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...
- UOJ_274_[清华集训2016]温暖会指引我们前行_LCT
UOJ_274_[清华集训2016]温暖会指引我们前行_LCT 任务描述:http://uoj.ac/problem/274 本题中的字典序不同在于空串的字典序最大. 并且题中要求排序后字典序最大. ...
- UOJ 275. 【清华集训2016】组合数问题
UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...
随机推荐
- java的加载与执行原理剖析
到目前为止,我们接触过的重点术语,总结一下: Java体系的技术被划分为三大块: JavaSE:标准版 JavaEE:企业版 JavaME:微型版 安装JDK之后: JDK:java开发工具箱 JRE ...
- UltraSoft - Beta - 设计与计划
在DDL Killer的Alpha发布版本一周后,我们积累了一定的用户数量和用户反馈,同时也着手准备Beta阶段的继续开发,在正式开始迭代前,先对我们的Beta阶段的需求做一个统计和预估,一是保证工作 ...
- Codeforces Round #573 (Div. 2) D题题解
一.题目 Tokitsukaze, CSL and Stone Game Tokitsukaze和CSL正在玩一些石头游戏. 一开始,有n堆的石头,第i堆石头数记为 \(a_i\),两人轮 ...
- OO第三单元——JML规格化设计
OO第三单元--JML规格化设计 JML语言的理论基础以及应用工具链情况 理论基础 JML是对JAVA程序进行规格化设计的一种表示语言,是一种行为接口规格语言.JML整合了Java和JAVAdoc,并 ...
- linux下命令拼接
前言:我个five,一道特别简单的拼接题没有做出来,我吐了,不过也是涨知识了 直接切入正题了 linux命令是可以拼接的,也就是说在一个system("???")下我们的???可以 ...
- 万维网www与HTTP协议
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105901440 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(二)
一.基于邻接表的Dijkstra算法 如前一篇文章所述,在 Dijkstra 的算法中,维护了两组,一组包含已经包含在最短路径树中的顶点列表,另一组包含尚未包含的顶点.使用邻接表表示,可以使用 BFS ...
- xmake v2.5.9 发布,改进 C++20 模块,并支持 Nim, Keil MDK 和 Unity Build
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...
- poj 3417 Network (LCA,路径上有值)
题意: N个点,构成一棵树.给出这棵树的结构. M条边,(a1,b1)...(am,bm),代表给树的这些点对连上边.这样就形成了有很多环的一个新"树". 现在要求你在原树中断一条 ...
- 『学了就忘』Linux基础命令 — 30、find命令详细说明
目录 1.find命令的基本信息 2.find命令基本使用 3.按照文件大小搜索 4.按照修改时间搜索 5.按照权限搜索 6.按照所有者和所属组搜索 7.按照文件类型搜索 8.逻辑运算符 (1)-a: ...