Solution Set - 组合计数
CF40E Number Table
显然 \(n,m\) 奇偶性不同时无解。奇偶性相同时,假设有一行全为空,剩下每行至少一个有空,则除这些位置外没有限制的位置都可以随便填,这些位置一定有唯一可行方案。又因为 \(k\lt \max(n,m)\),所以一定有一行或一列为空。假设是一行,如果有其它行全满,检查乘积是否为 \(-1\),不是则无解。是的情况可以直接忽略这一行。最后统计有多少可以自由选择的位置,假设 \(c\) 个,答案就是 \(2^c\)。
CF140E New Year Garland
先考虑如果放 \(i\) 个球的一行恰好出现 \(j\) 种颜色的方案数。这里固定这 \(j\) 种颜色的集合。可以使用 DP,记答案为 \(f_{i,j}\),转移为
\]
前一项乘 \(j\) 是选择 \(j-1\) 种颜色的集合,后一项乘 \(j-1\) 是保证相邻两个不相同。
再考虑总的方案数。定义 \(dp_{i,j}\) 为已经填好前 \(i\) 行,第 \(i\) 行恰好 \(j\) 种颜色的方案数。则
\]
通过预处理一行的和可以做到 \(O(L=\sum_{i=1}^{n}l_i)\)。注意要开一个内存池存 \(dp\) 数组,而且这题模数不一定是质数,可以通过计算模数的各个质因数幂次预处理组合数。
CF482D Random Function and Tree
一眼树形 DP。定义 \(dp_{i,0/1}\) 表示以 \(i\) 为根的子树中染奇数/偶数个点的方案数,偶数的情况允许不染。分奇偶是因为染色跟奇偶性有关。转移 \(dp_u\) 时,定义一个辅助的 DP 数组 \(f_{i,0/1}\) 表示已经考虑了 \(u\) 前 \(i\) 棵子树,染奇数/偶数个点的方案数。\(f\) 很好转移,最后 \(2f_{m,0}\rightarrow dp_{u,1},2f_{m,1}+1\rightarrow dp_{u,0}\)。当然有些情况是子树正序排列和倒序排列染色相同的。如果总数偶数,是若干棵子树选偶数个点;如果总数奇数,是奇数棵子树选奇数个点(剩下的子树不选)。前者直接乘法原理,后者再做 DP,\(f_{i,0}\) 表示前 \(i\) 棵子树中,奇数/偶数棵子树选奇数个点的方案数。很好转移。
CF325E The Red Button
为什么这里会有一道构造题啊
手玩容易发现奇数无解,证明很简单,因为每个点入度为 \(2\),而对 \(n=2m+1\),有边 \(0\rightarrow 0,m\rightarrow 2m,m\rightarrow 0,2m\rightarrow 2m\),这样 \(m\) 不管走向哪里都不行。
可以猜测偶数是有解的。记 \(n=2m\)。然后发现一个事情:\(i\) 和 \(i+m\) 的两条出边的终点是相同的。那可以先随便分,分完之后构成若干个环。如果整个图不止一个环,一定有一个 \(i\),\(i\) 和 \(i+m\) 不在一个环里。这个结论不太明显,但证明很容易:反证,如果不是,那么 \(i,i+m,2i,2i+1\) 都在一个环里,然后就可以从 \(0\) 开始依据二进制走到所有点。有这一条之后,用并查集维护每个点所属的环,扫描所有 \(i\),如果发现不同就交换,合并并查集。
CF896D Nephren Runs a Cinema
假设有 \(a\) 个 50,\(b\) 个 100,\(c\) 个 VIP,则最后留下 \(a-b\) 个 50。
熟知利用折线法可得:\(a\) 个 50,\(b\) 个 100,总能够找钱的方案数是 \(C_{a+b}^{a}-C_{a+b}^{a+1}\)。则上面 \(a,b,c\) 情况的方案数就是 \(C_{n}^{a+b}(C_{a+b}^{a}-C_{a+b}^{a+1})\)。
固定 \(a+b=m\) 求和,有 \(lef=\lceil \frac{m+l}{2} \rceil \le a \le rig=\lfloor \frac{m+r}{2} \rfloor\),答案就是 \(\sum_{m}C_{n}^{m}(C_{m}^{lef}-C_{m}^{rig+1})\)。\(O(n)\) 计算即可。
注意模数又不是质数,同样通过算质因子处理。
CF698F Coprime Permutation
观察一:相同质因数集合的数可以交换。
观察二:如果两个质数在 \([1,n]\) 中的倍数数目相同,可以交换这两个质数的所有倍数。
感觉这两个条件差不多了,那就差不多吧。也就是我们猜测这两个条件与题目条件充要。
根据题目中给出的一些位置,我们可以得到观察二中的交换关系。当然要判断这样交换是否合法。另外还要判断质因子集合的大小是否相同,毕竟这是一个不变量。对于观察二中的质数,显然会大于 \(\sqrt n\),所以只用考虑每个数的最大质因数。
判断合法后,我们可以知道对于某个质因数集合,有多少个数可以自由交换;同时我们也知道对于倍数数目相同的质数,有多少可以自由交换。把这些数的阶乘乘起来就是答案。
CF981H K Paths
按照被所有路径覆盖的边分类,它们当然也构成一条路径 \((u,v)\)。考虑所有路径在 \(u\) 一侧的端点。删掉 \(u\) 得到一些连通块,设不包含 \(v\) 的所有连通块大小为 \(c_1,c_2,\cdots,c_m\)。每个连通块内至多有一个路径端点,剩下如果有还没有分配的端点都只能是 \(u\)。路径有顺序,其实等价于两侧端点各自排列数的乘积。则 \(u\) 这一侧的排列数就是
\]
把给出的树看成有根树,定义 \(f_u\) 表示 \(u\) 子树内上式的值(或者说对路径 \((u,fa_u)\) 在 \(u\) 一侧的排列数),\(g_u\) 表示子树外(在 \(fa_u\) 一侧)。所有路径分成两类:祖先-后代链和其它。
对后者,总数是 \(\sum_{u,v}f_uf_v\),\(u,v\) 没有祖先后代关系。让每对 \((u,v)\) 在 LCA 处产生贡献。定义 \(s_u\) 是 \(u\) 子树内所有点 \(f\) 值的和,则 \(u\) 处的贡献是 \(\sum\limits_{v\neq w\in Son(u)}s_vs_w=\frac{1}{2}((\sum\limits_{v\in Son(u)}s_v)^2-\sum\limits_{v\in Son(u)}s_v^2)\)。
对前者,在链的祖先端点产生贡献,\(u\) 的贡献是 \(g_us_u\)。
剩下的问题是如何来求 \(f,g\)。上面那个式子是不太好维护的,所以考虑直接求出 \(\sum\limits_{|I|=k}\prod\limits_{i\in I}c_i\)。显然它是多项式 \(f(x)=\prod\limits_{i=1}^m(x+c_i)\) 的 \(x^{m-k}\) 次项的系数。来求 \(m\) 的展开式,用分治+NTT解决。一次求解的复杂度是 \(O(m\log^2 m)\),用这个方法求所有 \(f\) 的复杂度是 \(O(n\log^2 n)\)。
\(g_v\) 相当于 \(f_{fa_v}\) 换了一个一次因式,那么可以 \(O(m)\) 暴力除掉原来的因式,再乘上新的因式。这样可能被菊花图卡到 \(O(n^2)\),所以再做优化:同样的因式只算一次。也是蛮经典的套路了,因为 \(\sum c_i\le n\),所以不同的 \(c_i\) 的个数是 \(O(\sqrt n)\) 级别的,那么单次时间复杂度降到 \(O(m\sqrt n)\)。求和是 \(O(n\sqrt n)\)。
注意 \(k=1\) 需要特判。
CF750G New Year and Binary Tree Paths
感觉没有3200。
假设 \(a\) 到 \(b\) 的路径和为 \(s\),\(a,b\) 的 LCA 为 \(x\)。固定 \(x\),设 \(x\) 的深度为 \(d\)(\(1\) 的深度为 \(0\))。再固定 \(a,b\) 的深度 \(dl,dr\),放缩一下可以感觉到,如果 \(d,dl,dr\) 固定了,那么 \(x\) 至多一个。
事实上,做一下计算,固定 \(x,d,dl,dr\) 时,路径和最小值当然是 \(x\) 不断向左 \(dl-d\) 次(算上 \(x\) 经过 \(dl-d+1\) 个点),\(2x+1\) 不断向左 \(dr-d-1\) 次;最大值是 \(x\) 不断向右 \(dr-d\) 次,\(2x\) 不断向右 \(dl-d-1\) 次。可以算出此时路径和的取值范围是
\]
那么这个式子就证实了刚才的感觉。
枚举 \(d,dl,dr\),计算 \(x\),假设 \(s\) 离上面的左端点还有 \(t\)。我们把路径的两个端点在相应的层右移。找规律会发现,从一个点开始不断右移,它到根的距离增加量是这样一个数列:\(1,2,1,3,1,2,1,4,1,2,1,3,1,2,1,5,\cdots\)。第 \(i\) 项是 \(v_2(i)+1\)。对它求和得到,如果 \(u\) 是 \(x\) 子树内这一层的第 \(n+1\) 个点,则 \(u\) 到 \(x\) 的路径的总和比这棵子树内第一个点增加了 \(v_2(n!)+n=2n-S_2(n)\)。这里 \(v_2(n),s_2(n)\) 分别表示 \(i\) 中 \(2\) 的幂次,\(i\) 在二进制下 \(1\) 的个数。
所以我们只要解一个方程:\(2n-S_2(n)+2m-S_2(m)=t\)。\(n,m\) 就代表了左右端点分别是第几个,范围限制是 \(n\lt 2^{dl-d-1},m\lt 2^{dr-d-1}\)。
会发现 \(S_2(n),S_2(m)\le \log_2 10^{15}\lt V=50\),所以考虑枚举 \(S_2(n)+S_2(m)=q\),可以算出 \(n+m=p\)。对于这个问题 DP 解决,\(dp_{i,j,0/1}\) 表示已经填好了 \(n,m\) 的最低 \(i\) 位,其中填了 \(j\) 个 \(1\),下一位有没有进位。递推是容易的。
时间复杂度的一个上界是 \(O(V^6)\),但根本跑不满,最后跑的飞快。
Solution Set - 组合计数的更多相关文章
- [ZJOI2010]排列计数 (组合计数/dp)
[ZJOI2010]排列计数 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有 ...
- bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)
黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...
- BZOJ 4555: [Tjoi2016&Heoi2016]求和 [分治FFT 组合计数 | 多项式求逆]
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...
- BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...
- 【BZOJ5491】[HNOI2019]多边形(模拟,组合计数)
[HNOI2019]多边形(模拟,组合计数) 题面 洛谷 题解 突然特别想骂人,本来我考场现切了的,结果WA了几个点,刚刚拿代码一看有个地方忘记取模了. 首先发现终止态一定是所有点都向\(n\)连边( ...
- [总结]数论和组合计数类数学相关(定理&证明&板子)
0 写在前面 0.0 前言 由于我太菜了,导致一些东西一学就忘,特开此文来记录下最让我头痛的数学相关问题. 一些引用的文字都注释了原文链接,若侵犯了您的权益,敬请告知:若文章中出现错误,也烦请告知. ...
- 【BZOJ5323】[JXOI2018]游戏(组合计数,线性筛)
[BZOJ5323][JXOI2018]游戏(组合计数,线性筛) 题面 BZOJ 洛谷 题解 显然要考虑的位置只有那些在\([l,r]\)中不存在任意一个约数的数. 假设这样的数有\(x\)个,那么剩 ...
- 【BZOJ5305】[HAOI2018]苹果树(组合计数)
[BZOJ5305][HAOI2018]苹果树(组合计数) 题面 BZOJ 洛谷 题解 考虑对于每条边计算贡献.每条边的贡献是\(size*(n-size)\). 对于某个点\(u\),如果它有一棵大 ...
- 【BZOJ3142】[HNOI2013]数列(组合计数)
[BZOJ3142][HNOI2013]数列(组合计数) 题面 BZOJ 洛谷 题解 唯一考虑的就是把一段值给分配给\(k-1\)天,假设这\(k-1\)天分配好了,第\(i\)天是\(a_i\),假 ...
- 【BZOJ4005】[JLOI2015] 骗我呢(容斥,组合计数)
[BZOJ4005][JLOI2015] 骗我呢(容斥,组合计数) 题面 BZOJ 洛谷 题解 lalaxu #include<iostream> using namespace std; ...
随机推荐
- Oracle存储过程打印输出错误信息、行号,快速排查
测试存储过程如下: create or replace procedure prc_test is p_1 varchar2(2); begin p_1 := 'lxw测试'; exception w ...
- nuxt环境目录结构
- KingabseES执行计划-分区剪枝(partition pruning)
概述 分区修剪(Partition Pruning)是分区表性能的查询优化技术 .在分区修剪中,优化器分析SQL语句中的FROM和WHERE子句,以在构建分区访问列表时消除不需要的分区.此功能使数据库 ...
- KingbaseES 咨询锁
传统的事务性锁,读/写会自动加锁,读/写完成后会自动解锁(加解锁机制在细节上复杂),这是一种隐式的锁机制.对于加锁后的并发控制,也就是默认的写不阻塞读,是通过MVCC机制解决的.这种锁完全不需要人为干 ...
- Linux系统上安装jdk(CentOS 7 )
目录 001. 搜索jdk安装包 002. 下载安装jdk1.8 003. 配置环境变量 004. 验证是否配置成功 001. 搜索jdk安装包 yum search java | grep jdk ...
- yml和properties打印SQL日志信息
1.配置文件里面配置 第一种是properties类型如下 logging.level.com.datayes.mdi.dao.rdb.mommp.**=debug其中 com.datayes.mdi ...
- #dp#洛谷 3473 [POI2008] UCI-The Great Escape JZOJ 4019 Path
题目 \(n*m\)的地图,计算从\((n,1)\)到第\(x\)列的第\(y\)行的路径条数\(\bmod k\) , 走过的点不能再走,转弯只能向右转.转弯完之后必须往前走一格 分析 可以发现,走 ...
- MyBatis resultMap中collection过滤空字段
在使用MyBatis查询数据时,返回值可以定义为resultMap. 如果返回的对象中有列表,还可以使用collection标签进行定义. 此时,如果不想某些字段为空的数据加入列表,可以使用notNu ...
- 在Mac系统上使用Qt调用摄像头不出图解决方法
需求:在Mac系统上,调用摄像头,实现旋转.缩放.处理视频帧等功能 问题:使用获取视频帧的方法,在Mac上调不起来摄像头 解决方法: 将视频窗口(QVideoWidget)和视频帧(QVideoFra ...
- Java面试题总结:基础及语法篇169道
下载链接:https://gitee.com/ItBoShao/wechat_applet/blob/master/Java面试题总结:基础及语法篇169道.pdf