$2018/8/19 = Day5$学习笔记 + 杂题整理
\(\mathcal{Morning}\)
\(Task \ \ 1\) 容斥原理
大概这玩意儿就是来用交集大小求并集大小或者用并集大小求交集大小的\(2333\)?
那窝萌思考已知\(A_1,A_2,A_3 \cdots A_n\),求\(|A_1 \cup A_2 \cup A_3 \cdots A_n|\)
那我们考虑用\(|A_1 \cap A_2 \cap A _3 \cdots A_n|\)来推
\(emmmm\)实际上就是\[|A_1 \cup A_2 \cup A_3 \cdots A_n| = \sum\limits_{k=1}^{n}{(-1)^{k-1}\sum \limits_{1 \leq i_1 < i_2 \cdots i_k \leq n}|A_{i_1} \cap A_{i_2} \cap \cdots A_{ik}| }\]
这个问题其实换一种方式思考,就可以逆过来推出\(|A_1 \cap A_2 \cap A_3 \cdots A_n|\)
因为\[|A_1 \cap A_2 \cap A_3 \cdots A_n| = \overline {\overline {A_1} \cup \overline {A_2} \cdots \cup \overline {A_n}}\]
我们直接暴力带入容斥的基本公式,\(233\)好像很麻烦的样子
那么可以有\[|A_1 \cap A_2 \cap A_3 \cdots A_n| = 2^n - \sum\limits_{k=1}^{n}{(-1)^{k-1}\sum \limits_{1 \leq i_1 < i_2 \cdots i_k \leq n}\overline{|A_{i_1} \cup A_{i_2} \cup \cdots A_{i_k}|} }\]
我们可以把最后一项的补集拿掉,变成这样:
\[|A_1 \cap A_2 \cap A_3 \cdots A_n| = 2^n - \sum\limits_{k=1}^{n}({(-1)^{k-1} \cdot \binom{n}{k} \cdot 2^n - \sum \limits_{1 \leq i_1 < i_2 \cdots i_k \leq n}|A_{i_1} \cup A_{i_2} \cup \cdots A_{i_k}|} )\]
我一开始把\(\Sigma\) 里面的全集当成了\(2^k\)……\(GG\)然后还因为没有加括号被胡佳琛嘲讽了一顿\(\rm{TAT}\)
似乎知道这些并没有什么用,因为题目里面根本不可能这么浅显\(2333\) ……
今时今日所记,不期理解多么深刻,只期不忘却罢了。
小例题:
\(\color{red}{\mathcal{Description}}\)
在 \(n × m\) 的棋盘上放棋子。 棋子有 \(c\) 种不同的颜色。 同一个位置最多放一个棋子。 要求每行至少有一个棋子,每列至少有一个棋子,每种颜色的棋子至少在棋盘中有一个。 求方案数对 \(P\) 取模。 \(n, m, c ≤ 100, P ≤ 10^9\)
这个题就是一个容斥题……不会不会\(233\)
\(\color{red}{\mathcal{Solution}}\)
一般来说,这种容斥题目,都是有着某种诡异的限制,比如什么"每行每列至少放XXX个","不合法的情况包括"之类的专业智障词汇……所以我们在思考容斥的状态时不妨把这些也考虑进去。
不用慌,其实我在写下这些文字的时候也是很蒙圈,也是一边\(Tab + Alt\)看题解一边写的,所以不要担心,大家水平都不咋地。
啊哈哈哈哈哈哈只是开个玩笑啦~
此处考虑一个限制条件:至少一个。那么不妨令 \(A_i\) 表示第 \(i\) 行至少有一个棋子的方案, \(B_j\) 表示第 j 列至少有一 个棋子的方案, \(C_k\) 表示第 \(k\) 种颜色的棋子至少有一个的方案。
那我们其实要求的就是一个一个大交集:\[A_1 \cap A_2 \cap A_n \cap B_1 \ · · · \cap B_m \cap C_1 \ · · · \cap C_c\]。
那么接着令\(f(p, q, r)\) 表示违反了 \(p\) 个行限制, \(q\)个列限制, \(r\) 个颜色限制的 方案数。
▶ \[f(p, q, r) = \binom{n}{p} \binom{m}{q} \binom{c}{q}(c + 1 - r)^{(n-p)(m-q)}\].
答案是 \[∑ \limits _{p=0}^{n}∑\limits _{q=0}^{m}∑\limits _{r=0}^{c}(-1)^{p+q+r}f(p, q, r)\]。 可以用 \(O(100^2)\) 时间预处理组合数, \(O(nmc ~~log(nm))\) 暴力计算。
怕了吧,还有更可怕的\(233\)
\(\color{red}{\mathcal{Description-plus}}\)
问题不变,但是\(n, m, c ≤ 1000\)
\(\color{red}{\mathcal{Solution-plus}}\)
\(hh\)看起来\(n^3\)量级的算法过不去了……那么思考二项式定理
我们展开\(f\)就会有
\[ ∑ \limits _{p=0}^{n}∑\limits _{q=0}^{m}∑\limits _{r=0}^{c}(-1)^{p+q+r}\binom{n}{p} \binom{m}{q} \binom{c}{q}(c + 1 - r)^{(n-p)(m-q)}\]
继而稍微稍微交换一下求和顺序有
\[ ∑ \limits _{p=0}^{n}∑\limits _{r=0}^{c}(-1)^{p+r}\binom{n}{p} \binom{c}{q} ∑\limits _{q=0}^{m}(-1)^q\binom{m}{q} (c + 1 - r)^{(n-p)(m-q)}\]
好像有些眉目……?继续
\[ ∑ \limits _{p=0}^{n}∑\limits _{r=0}^{c}(-1)^{p+r}\binom{n}{p} \binom{c}{q} ∑\limits _{q=0}^{m}(-1)^q\binom{m}{q} ((c + 1 - r)^{n-p})^{(m-q)}\]
我们会发现——又是泥!二项式定理!
\[ ∑ \limits _{p=0}^{n}∑\limits _{r=0}^{c}(-1)^{p+r}\binom{n}{p} \binom{c}{q}((c+1-r)^{n-p}-1)^m\]
我顿时发现好像构造二项式定理好像在组合问题中很常见,所以感觉好厉害的样子\(233\)
不知道\(Day1\)的出题人当时出了一道这种题是怎么个想法,有可能他是为了提醒我们或者启发我们这个\(trick\)?
随机推荐
- Node.js从入门到实战ECMAScript6一页纸总结(很大的一页纸)
一.ES5/ES6和babel ECMAScript5,即ES5,是ECMAScript的第五次修订,于2009年完成标准化,现在的浏览器已经相当于完全实现了这个标准.ECMAScript6,即ES6 ...
- 在AE二次开发中出“正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”异常解决方案
今天的一个项目总用到了AE的开发组件,也就是ESRI公司提供的一系列的开发包(组件)都是以dll(动态链接库的形式)然后今天在调试的时候却出现了“正试图在 OS 加载程序锁内执行托管代码.不要尝试在 ...
- SQL事务在存储过程的应用
-- ============================================= -- Author: jf_ou -- Create date: 2017-08-22 -- Desc ...
- Google JavaScript样式指南
Google JavaScript样式指南 目录 1简介 1.1术语说明 1.2指南说明 2源文件基础知识 2.1文件名 2.2文件编码:UTF-8 2.3特殊字符 3源文件结构 3.1许可或版权 ...
- CSS之浮动布局(float,浮动原理,清除/闭合浮动方法)
css之浮动布局 本人博客:查看文章 1.什么是浮动:在我们布局的时用到的一种技术,能够方便我们进行布局,通过让元素浮动,我们可以使元素在水平上左右移动,再通过margin属性调整位置 2.浮动的 ...
- linux 根据进程名杀死进程 -kill进程名
前两天一个老师给我出了一个linux操作上的问题,现在知道进程名怎样杀死这个进程.或许很多人都会和我一样说用 #pkill 进程名 或是 #killall 进程名 的确这个两个命令都能做到这些,而且我 ...
- js 中文长字符截短&关键字符隐藏 自定义过滤器
两个非常简单的过滤器:隐藏关键字符和字符截短.同样也可以迁移到ng和原生js直接使用(去掉avalon.filters声明即可).后期还有不错的过滤器,还往这里面加 keyword:avalon,js ...
- XML与DataSet的相互转换的类
一.XML与DataSet的相互转换的类 using System; using System.Collections.Generic; using System.Text; using System ...
- ARC中block块作为属性的使用笔记
ARC中block块作为属性的使用笔记 block较难理解,根据在内存中的分布情况就分为3种类型,根据使用的情形又分为很多很多种.虽然用起来容易,但使用不当会造成内存泄露,虽然都是这么说,但你真的研究 ...
- Ubuntu Linux 14.04 LTS 上安装php7+mysql+nginx
输入 $ sudo apt-get install -y language-pack-en-base$ sudo LC_ALL=en_US.UTF-8 add-apt-repository ppa:o ...