容斥计数题确实没做
QOJ15623 Charity Raffle
定义序列 \(a\),其中 \(a_i\) 的值为 \(i\) 的出现次数。我们想要求所有 \(\max a_i\le m,\sum a_i=k\) 且 \(a\) 可出现的 \(a\) 个数。
先考虑判定问题。最大值比较特殊,考虑最大值,若最大值出现次数 \(\ge 2\),那么我们可以选择其中两个最大值不断让它们选选到最大值然后剩下的数都可以构造出来了,所以一定有解;若最大值出现次数 \(=1\),则次大值一定为最大值 -1 且必须出现在最大值后面,这样才能通过不断操作最大值和次大值还原。发现合法方案判定比较繁琐,但是不合法方案判定很简洁:设最大值为 \(t\),则要求最大值出现次数恰好为 \(1\),且若设最大值出现位置为 \(p\) 则要求 \([1,p)\) 中 \(\le t-1\) 且 \((p,n]\) 中 \(\le t-2\)。
考虑对这玩意计数。最大值 \(t\) 太特殊,将其减 \(1\) 后变成新的序列,可以发现若将最后一个最大值加 \(1\) 后变为原序列,所以建立了双射,转变为对 \(\max a_i\le m-1,\sum a_i=k-1\) 的 \(a\) 计数,然后用总方案数(\(\max a_i\le m,\sum a_i=k\))减去这个就是答案。容斥的复杂度显然是 \(O(\frac{k}{m})\) 的。
LOJ575 不等关系
两个限制确实很烦,一个套路是将其中一个容斥掉,这道题中钦定大于号不合法(变成小于号),剩下的大于号没有限制,那么方案数就是一个多重组合数,等于 \(\frac{n!}{\prod l_i!}\),其中 \(l_i\) 是第 \(i\) 段递增序列的长度。设 \(f_i\) 表示前 \(i\) 个位置并且第 \(i\) 位是被钦定的大于号时的带权方案数,转移显然有 \(f_i=-\sum_{s_j为>}f_j\frac{1}{(i-j)!}\),注意最终转移到 \(n\) 位置上(因为最后一个钦定的位置后面还有一段序列),最后乘上 \(n!\) 即可,注意由于这里带的系数是 \(-1\) 的没被钦定的大于号个数次方,所以最终要乘上 \(-1\) 的大于号个数次方以修正容斥系数;由于最后转移到 \(n\) 多乘了个 \(-1\),所以还要再乘回来。转移式子是一个半在线卷积,分治 NTT 时间复杂度 \(O(n\log^2 n)\)。
QOJ15326 Yet another 01 problem
究极牛逼计数题。我该如何想到呢?????
这个题先拆成分别对树形态计数和对边权赋值方案数计数,初步的观察是若一个节点有两个叶子结点且两个叶子结点的权值相等就倒闭了;然后你再发现边权限制有点难搞,转为对点权计数然后点权赋值方案显然唯一对应边权赋值方案(点权为到根路径上边权异或和),好处在于点权可以随便赋,跟前后面填的值无关。(好处这里我可能没太懂)
点权的限制为:若一个节点有两个叶子结点,则两个叶子结点的权值不能相同;若一个节点有恰好一个叶子结点,则非叶子结点的那个儿子的权值确定(为那个叶子结点的权值的取反);若一个节点的两个儿子都不为叶子,则两个儿子的权值只需要相反即可。边权赋值方案数在有解的情况下值为 \(2^{两个儿子都是非叶子结点的节点数}\)。
发现还是很难做,根本在于“两个儿子都是非叶子结点的节点数”比较难以表示。一个比较人类智慧的想法是将“两个儿子都是非叶子结点的节点数”转化为“两个儿子都是叶子结点的节点数 -1”。为啥正确呢?考虑将有零或两个叶子结点的点视作关键点建虚树,将有两个叶子结点的点连同它的儿子们都缩成一个大点,那么显然这棵新树中的非叶子结点数等于叶子结点数 -1。这里由于需要有解,所以要求两个叶子的权值不同。
现在考虑计数。可以看做一个两个叶子儿子权值相同的点贡献为 \(0\),权值不同的点贡献为 \(2\),其他点没贡献(贡献为 \(1\)),求所有点的贡献之积是多少。发现我们很难完全的统计所有有贡献的点(就是容易算漏),考虑容斥,拆掉两个贡献值,\(0=1-1,2=1+1\),算乘积时我们既可以选第一项也可以选第二项,组合意义就是我钦定两个叶子相邻,若两个叶子权值相同则有 \(-1\) 的贡献,不同则有 \(1\) 的贡献。我们只需要知道最后剩下了多少个点,然后把它们随便串成一棵满二叉树,卡特兰数板子,有 \(n\) 个非叶子结点的满二叉树方案数为 \(C_n\)。
对于求剩下多少个点,考虑分治,维护多项式 \(f_{i,j}\) 表示左边选没选,右边选没选(因为可以跨中点合并所以需要记录这两个状态),多项式第 \(i\) 项系数表示剩下 \(i\) 个点的方案数,先求出左边和右边内部的多项式 \(f\),合并是平凡的(其实是不会说话了)。注意由于可以跨中点合并,所以当左半边右侧没被选且右半边左侧没被选时可以选 \((mid,mid+1)\),贡献也是平凡的。注意一些边界情况。卡常的话可以优化状态记录以减少卷积次数。复杂度 \(O(n\log^2n)\)。

浙公网安备 33010602011771号