2021-4-1考试

2021-4-1

考试第一题写了15分暴力,第二题写正解,第三题写41分暴力。最终第一题15->3,第二题100->95,不过好像没差多少。。

下午似乎把第一题想出来了。晚上讲插头dp。

2021-4-1 异或

题意

给出 (n) 个数,问有多少个子集(可重)满足这个子集不存在两个数满足 (a ext{xor} b< x)(x) 给定。

题解

我自己想的办法

考虑给他建立一个 trie,然后从根开始往下看。如果根节点与两个儿子形成的边代表的位比 (x) 的最高位还要大,那么左右儿子其实是独立的。因为两个数如果来自两边,那么一定不会违反规则。所以根节点子树内选的方案数就是两个儿子的方案数的乘积。

如果根节点与儿子之间的边没有 (x) 的最高位大(即一样或者小),并且 (x) 的这一位是 1,那么一定只能在左子树里选一个,右子树里选一个。如果某棵子树选了两个,那么一定不符合条件,因为肯定比 (x) 小了。具体对于左边一个数,顺着右边的儿子枚举是在哪一位开始比 (x) 大或者与 (x) 相等就行了。复杂度应该是 (nlog_2n) 左右?

如果 (x) 这意味是 0 ,那么左边和右边随便选就行了,注意左边和右边都可以不选。

题解的办法

假设 (x) 一共有 (i) 位,那么将每个数的后 (i) 位去掉,并按照剩下的位分组。可以发现,同一组的数最多选 0 或 1 或 2 个,因为在 (x) 的最高位那一位上同一组内的所有数必须不同。

总结

关键点在于考虑到不同块之间的独立性,这需要多尝试,没有什么别的办法。大概感觉到不能选太多数,要不然会有两个数异或起来很小。

2021-4-1 计数

题意

求所有长度为 (n) ,每个位置上的数可以是 ([1,k]) 中的整数的序列,(max{L(a)-x,0}) 的和。其中 (x) 是一个给定的常数。

其中 (L(a)) 表示这个序列是 (a) ,他的最长连续相同段的长度是多少。

题解

考虑计算 (max{L(a)-x,0}ge a) 的序列数量。也就是计算 (L(a)ge x+a) 的排列数量。可以先枚举一共有多少段,再枚举有多少个 (L(a) ge x+a) 的段,来一个容斥就行了。

然后可以列出来算式,算式有一块是:

[inom{n}{m-1}inom{m}{i} ]

可以考虑给第二块拆开,然后就变成:

[inom{n}{m}inom{m}{k} ]

直接使用一波组合恒等式:

[inom{n}{k}inom{n-k}{m-k} ]

会发现有一块是二项式定理,给他算出来,就可以 (mathcal O(nln n)) 计算结果了。

总结

直接做就完了,没有好总结的。

原文地址:https://www.cnblogs.com/YouthRhythms/p/14607892.html