Loading

计数题做题记录

计数题做题记录

\(\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\) 对匹配的方案数,那么有

\[f_i=\binom{n}{i}\binom{m}{i}i!(n+1)^{m-i}(m+1)^{n-i} \]

前面的 \(\binom{n}{i}\binom{m}{i}i!\) 是选出 \(i\)\(i\) 列并匹配的方案数,后面的是其他行列的方案数。

而不存在匹配的方案数就可以容斥,得到

\[ans=\sum_{i=0}^n(-1)^if_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\) 个点中至少要连一条边,方案数为

\[\sum_{l=1}^j\binom{j}{l}(a-1)^l=a^j-1 \]

类似地,上面的 \(i-j\) 个点可以随便连,方案数为

\[\sum_{l=0}^{i-j}\binom{i-j}{l}(a-1)^l=a^{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\) 内的点构成了一个环,那么成环的方案数为

\[\frac{\prod_{i=2}^nin_i}{\prod_{i\in S}in_i} \]

即指定环上的点的父亲,其余的点乱选。

显然这样算不会算重。

加入一条 \(s\to t\) 的边后,原图上每条 \(t\to s\) 的路径都会变成一个环,所以可以用拓扑排序做。

\(\text{V}\). CF1842G Tenzing and Random Operations

易得答案为

\[\frac{1}{n^m}\sum_{m_1+\cdots+m_n=m}\binom{m}{m_1,\cdots,m_n}\prod_{i=1}^n(a_i+v\sum_{j=1}^im_j) \]

因为后面的 \(\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}\)。所以答案为

\[\frac{1}{n^m}\sum_{j=0}^nf_{n,j}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\)

而瓶颈在于计算

\[\sum_{i=1}^n\sum_{j=1}^n\binom{n}{i}\times\binom{m}{j}\times2\times2^{(n-i)(m-j)}\times(-2)^{i+j} \]

这可以容易的用二项式定理优化到 \(O(n\log n)\)

posted @ 2025-03-06 15:30  LIUIR  阅读(8)  评论(0)    收藏  举报