计数题做题记录
计数题做题记录
\(\text{I}\). [AGC035F] Two Histograms
显然一个网格不只对应一个操作序列,于是考虑什么情况下一个网格会对应多个操作序列。一个简单的例子如下
0 0 1 0
0 0 1 0
0 0 1 0
1 1 1 0
0 0 0 0
此时 \(k_3=2\land l_3=3\) 和 \(k_3=3\land l_3=2\) 就重复了。因此,猜测不考虑存在 \(i,j\) 满足 \(k_i=j-1,l_j=i\) 的网格就可以不重不漏的表示每一种情况:
-
不漏:考虑将 \(k_i\) 改为 \(j\),\(l_j\) 改为 \(i-1\) 后网格显然不变。
-
不重:考虑两个不满足上述条件的操作序列 \(k,l\) 和 \(k^\prime,l^\prime\),假设两者表示的网格是相同的。
找到最小的 \(j\) 满足 \(l_j\not=l^\prime_j\),不妨设 \(l_j<l^\prime_j\)。记 \(i=l^\prime_j\)。
因为 \((i,j)\) 这个位置要相同,所以有 \(k_i\ge j\land k^\prime_i<j\)。然后再分类讨论:
-
若 \(j=1\),说明 \(k^\prime_i=0=j-1\),与题设矛盾。
-
否则,有 \(k^\prime_i<j-1\)。又因为 \(l_{j-1}=l^\prime_{j-1}\),所以 \((i,j-1)\) 这一位置不合法,与假设矛盾。
-
综上,只需计数不存在 \(i,j\) 满足 \(k_i=j-1,l_j=i\) 的网格的情况。
考虑容斥,将一组 \(k_i=j-1,l_j=i\) 看作匹配。设 \(f_i\) 表示钦定形成了 \(i\) 对匹配的方案数,那么有
前面的 \(\binom{n}{i}\binom{m}{i}i!\) 是选出 \(i\) 行 \(i\) 列并匹配的方案数,后面的是其他行列的方案数。
而不存在匹配的方案数就可以容斥,得到
\(\text{II}\). [ABC306Ex] Balance Scale
先不考虑 =
的情况。
考虑若 \(v(a_i)<v(b_i)\),就从 \(a_i\) 向 \(b_i\) 连一条有向边。这样一定会形成 DAG。
考虑在 DAG 上分层 DP。设 \(f_s\) 表示点集 \(s\) 内的方案数,每次加入在最后加入点集 \(t\)。
但这样会算重,考虑给每个 \(t\) 一个容斥系数。手模一下可以发现容斥系数为 \((-1)^{\left|t\right|+1}\)。
再考虑 =
,这就相当于在图上把两个点缩成了一个点。
然后再枚举 \(t\),这时 \(t\) 内部的边都一定是 =
,容斥系数为 \((-1)^{\text{连通块个数}+1}\)。
\(\text{III}\). Luogu P11173 「CMOI R1」We Want To Run / Nilpotent
经典地,把矩阵看作一张图。那么一张图的贡献就是其最长路径上的节点数,若有环则无贡献。
进一步的,对于一个 DAG,它还对应这 \((a-1)\) 的边数次方个矩阵,所以贡献要乘上这个系数。
先考虑一个暴力的 DP,设 \(f_{d,i,j}\) 分别表示当前的 DAG 有 \(d\) 层,总节点数为 \(i\),最后一层的节点数为 \(j\) 时对应的矩阵的方案数。那么答案就是 \(\sum_{d=1}^n\sum_{i=1}^nf_{d,n,i}\times d\)。
转移就枚举下一层的节点数 \(k\),然后考虑计算系数。显然有 \(\binom{n-i}{k}\),至于剩下的,这一层的 \(j\) 个点中至少要连一条边,方案数为
类似地,上面的 \(i-j\) 个点可以随便连,方案数为
这样是 \(O(n^4)\) 的,考虑优化。
注意到 \(d\) 不会影响转移,只会用于计算答案,于是另设 \(g_{d,i,j}=f_{d,i,j}\times d\),这样就可以把 \(d\) 这一维消掉了。
\(\text{IV}\). [HNOI2015] 落忆枫音
先考虑一个 DAG 的外向生成树个数,显然是 \(\prod_{i=2}^nin_i\),其中 \(in_i\) 表示点 \(i\) 的入度。证明可以分别考虑每个点在树上的父亲,这是互不影响的。
否则就要减去成环的方案数。假设集合 \(S\) 内的点构成了一个环,那么成环的方案数为
即指定环上的点的父亲,其余的点乱选。
显然这样算不会算重。
加入一条 \(s\to t\) 的边后,原图上每条 \(t\to s\) 的路径都会变成一个环,所以可以用拓扑排序做。
\(\text{V}\). CF1842G Tenzing and Random Operations
易得答案为
因为后面的 \(\prod\) 只会有 \(n\) 项被算到答案中,于是可以按这个 DP。
设 \(f_{i,j}\) 表示考虑到 \(i\),已经确定了了 \(j\) 次操作时的答案:
-
若 \(i\) 是乘上 \(a_i\),那么有 \(f_{i,j}=f_{i-1,j}\times a_i\)。
-
若 \(i\) 是乘上一个之前被统计过的 \(v\),那么要在 \(j\) 个中选一个,有 \(f_{i,j}=f_{i-1,j}\times j\times v\)。
-
若 \(i\) 是乘上一个之前没有被算过的 \(v\),那么先在 \(m-j+1\) 次操作中选一次,再在 \([1,i]\) 中选一个操作点,有 \(f_{i,j}=f_{i-1,j-1}\times i\times(m-i+1)\times v\)。
然后考虑 \(f_{n,i}\) 对答案的贡献,剩余没有被确定的操作可以乱选,方案数为 \(n^{m-j}\)。所以答案为
\(\text{VI}\). LuoguP11746 Dynamic Color Problem
显然当 \(2|(n+m)\) 时无解。
现在是「有奇数行/列颜色相同贡献为 \(0\),否则贡献为 \(1\)」。
考虑用「贡献始终为一」加上「有奇数行/列颜色相同贡献为 \(-1\),否则贡献为 \(1\)」,然后再除以 \(2\) 得到答案。
前者就是 \(2^{nm}\),只需考虑后者。
此时相当于有一行/列颜色相同就会乘上 \(-1\) 的贡献。考虑指定 \(i\) 行 \(j\) 列相同,根据经典结论,这样的贡献是 \((-2)^{i+j}\)。
然后就可以做到 \(O(n^2)\) 了。注意特判 \(i=0\lor j=0\)。
而瓶颈在于计算
这可以容易的用二项式定理优化到 \(O(n\log n)\)。