4.8 计数

[ABC288Ex] A Nameless Counting Problem

经典题目。

首先发现这个单调的限制非常麻烦,发现如果每个数都不相同就可以直接除以 \(len!\) 得到想要的值,而这里的限制又是异或形式,相同的两个数可以直接删掉。所以直接枚举有多少剩下的数。

这个可以用 dp 求,剩余部分就是繁琐的转移了,大概的思路是枚举有多少种数出现了技术次,其余出现偶数次的随意选上,上限限制数位 dp 以下就行,最后简简单单容斥掉重的情况就行。

[AGC068D] Sum of Hash of Lexmin

首先容易发现的一个性质是每个点后面不能接在其子树内的点,这种满足若干个相似限制的容易想到容斥。

依据数据范围与树型结构大概是 dp。

答案同时求出不太现实,思考一下如果我们要求单个点的答案该怎么办。

此时可以直接钦定某些点在其左侧,某些点在其右侧,\(B\) 的贡献自然好求。

那么怎么容斥呢?

发现钦定 \(cnt\) 组不合法相当于是树上形成了 \(n-cnt\) 条由祖孙关系构成的“链”,dp 状态中记录左侧和右侧的链的数量,合并子树时直接组合数。

如何计算当前点的贡献呢?

其可以单独成长度为 \(1\) 的链,也可以考虑接在左右链中的某一个上,转移好些,就是分讨有点多,要区分是否是当前计算的点 \(p\)\(p\) 在其子树内,\(p\) 不在其子树内。

你又发现状态转移式子只跟子树内有没有 \(p\) 有关系,所以 dp 中再维护一维 \(0/1\) 就行了。

复杂度 \(O(n^4)\)

[清华集训 2024] 乘积的期望

数据分治+性质题。

目前依然没有很会实现,之后看到了就试试写一写吧。

大致理一理核心思路。

首先这个 \(n \le 50\) 的数据范围十分诡异。有可能是维度较高的 dp,也有可能是折半之类的指数级算法。

又观察发现有一个同样非常诡异的 \(m\),思考能否根据 \(m\) 数据分治。

考虑 \(2^m\) 级别的算法怎么做。连乘可以考虑组合意义,相当于对于每个数选一个覆盖了它的区间的方案数,转换成对于每个区间选择若干个数,此时有用的区间就只有至多 \(n\) 个了,可以在 dp 状态中存下使用过的区间的个数,最后再乘上一个组合数即可。

那么怎么 dp 呢?发现一个子集可能对应多个可选的左端点,所以 dp 状态中状压存储有那些点被作为了左端点。转移不算难。

此时复杂度达到 \(O(n^2m2^m)\),可以解决 \(m\le 16\) 的情况,发现这基本就是 \(m < \frac{n}{3}\) 的情况。

考虑 \(m \ge \frac{n}{3}\),先将 \(n\) 补齐为 \(3m\),后面补齐的部分强制不选即可。

考虑一下有没有什么性质,发现对于 \(i:1\sim m\)\(a_i+a_{i+m}+a_{i+2m}=C\),此时只需要考虑 \(a_i,a_{i+2m}\) 就行了。再想想会发现 \(a_{1\sim m}\) 单调不降,\(a_{2m+1\sim 3m}\) 不增,\(a_m+a_{2m+1}\le C\)

注意到这就是操作合法的充要条件,此时你就可以进行一个 \(O(nC^4)\) 的 dp,根据我们 \(O(n^2m2^m)\) 的解法每次结尾只有一个组合数与 \(C\) 有关,答案是一个关于 \(C\)\(n\) 次函数。拉格朗日插值,\(O(n^6)\)

posted @ 2026-04-09 20:32  paper_zym  阅读(16)  评论(0)    收藏  举报