\(\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\)?

随机推荐

  1. Yii 时间戳格式化显示的问题

    这个控件是CJuiDatePicker控件的扩展,支持时分秒. 下载地址:http://www.yiiframework.com/extension/timepicker/ 这个控件用在view里的_ ...

  2. jedis、jedisPool、jedisCluster的使用方法

    jedis 连接redis(单机): 使用jedis如何操作redis,但是其实方法是跟redis的操作大部分是相对应的. 所有的redis命令都对应jedis的一个方法     1.在macen工程 ...

  3. <Android 基础(二十九)> Fragment (2) ~ DialogFragment

    简介 上一篇简单的介绍了下Fragment的使用方法,这一篇主要看下DialogFragment. 在android 3.0时被引入.是一种特殊的Fragment,用于在Activity的内容之上展示 ...

  4. WPF ListView 使用GridView 带有Header 以及点击header排序 sort

    ListView: <ListView x:Name="lvFiles" VerticalAlignment="Stretch" Background=& ...

  5. android中的ellipsize

    textview中有个内容过长加省略号的属性,即ellipsize 用法如下: 在xml中 android:ellipsize = "end" 省略号在结尾 android:ell ...

  6. Multiple Database Block Sizes and the Buffer Cache

    In oracle 10g we can have multiple block sizes at the same time. When a tablespace is created we can ...

  7. 数组转换list集合问题

    1问题的起因: 项目总要使用一个方法把数组转换成list集合,百度说有这个方法Arrays.asList可以实现 2结果报错 抛出java.lang.UnsupportedOperationExcep ...

  8. PHP匹配当前传入是何种类型

    本文出至:新太潮流网络博客 /** * [is_string_regular_type 正则自动验证传入数据] * @E-mial wuliqiang_aa@163.com * @TIME 2017- ...

  9. Coroutine及其实现

    线程是内核对外提供的服务,应用程序可以通过系统调用让内核启动线程,由内核来负责线程调度和切换.线程在等待IO操作时线程变为unrunnable状态会触发上下文切换.现代操作系统一般都采用抢占式调度,上 ...

  10. Script" References MACLEAN‘s post Speed ​​up the index creation.

    alter session set workarea_size_policy=MANUAL; alter session set db_file_multiblock_read_count=512; ...