8.1 简单计数题
A
给定整数 R,G,B,KR, G, B, KR,G,B,K。请计算满足以下所有条件的由
R
、G
、B
组成的字符串 SSS 的个数,并输出其对 998244353998244353998244353 取模的结果。
- SSS 中
R
、G
、B
的个数分别为 R,G,BR, G, BR,G,B。- SSS 中作为连续子串出现的
RG
的个数恰好为 kkk。
不难发现恰好 KKK 对并不好做,如果钦定 kkk 对又容易算多,考虑插入。
先插入 R
的话,我们就要考虑 G
和它配对,先插入 G
也一样,我们以先插入 R
为例。
考虑钦定 kkk 个 R
后面插入 G
,这样可以保证不会有超过 kkk 个 RG
。如果选择钦定 kkk 个 RG
的坏处是又会算多又会算重,算多可以容斥,算重不好搞。于是考虑宁可不到 k
个,也不要多。
所以我们先钦定了 kkk 个 R
去与 G
配对后,我们需要将 B
也插入进去,这步的方案数是 (Rk)×(R+BR)\binom{R}{k}\times\binom{R+B}{R}(kR)×(RR+B) 就是划分成 R+1R+1R+1 个可空集合,方案数就是假设我们对每个集合都加一个数后,就是划分非空集合了。
然后我们考虑插入,我们现在有 B+kB+kB+k 个位置可以插入 G
,然后这个是容易处理的,但是我们并没有考虑到直接插可能会导致有些地方需要 G
,但是我们并没有插入 G
,这有两种方式处理,要么先给这些位置分配一个 G
然后再做,要么容斥,显然前面一个更加简单,但是作者写题时非常唐,居然写了后一个。
B
给定集合 SSS,∣S∣=n|S|=n∣S∣=n,问有多少对非负整数对 (x,y)(x,y)(x,y) 满足:0≤x≤y≤c0\le x\le y\le c0≤x≤y≤c,y+x∉Sy+x\notin Sy+x∈/S 且 y−x∉Sy-x\notin Sy−x∈/S,保证 ∀x∈S,0≤x≤c\forall x\in S,0\le x\le c∀x∈S,0≤x≤c。
考虑如何做,这个东西应该不难想到容斥,直接去做两个不属于大概不好做。
容斥后,我们就要去考虑 y+x∈Sy+x\in Sy+x∈S 和 y−x∈Sy-x\in Sy−x∈S 的数量了,显然我们枚举 z∈Sz\in Sz∈S,考虑它会被这样的二元组包含几次,首先 x+y=zx+y=zx+y=z 的不难处理,注意 x≤yx\le yx≤y 即可。然后考虑 y−x=zy-x=zy−x=z 怎么算,这个东西应该也不难。按照算下 yyy 的上下界就结束了。
然后我们还要考虑 y+x∈Sy+x\in Sy+x∈S 且 y−x∈Sy-x\in Sy−x∈S 的二元组数量,这就是找两个在 SSS 中的数判断它们是否能被这样表示,不难发现这个条件要求同奇偶,又因为 ∀x∈S,x≤c\forall x\in S,x\le c∀x∈S,x≤c,所以任意同奇偶的两个数都能被算到,于是按照奇偶分开算即可,注意我们还要考虑同一个数会不会被算到,注意到 x=0x=0x=0 是合法的,于是可以被算到。但是你其实还是要考虑你是否在算 y+x∈Sy+x\in Sy+x∈S 和 y−x∈Sy-x\in Sy−x∈S 的时候都会算到。我的写法将两种合并了,于是不会算重,于是无需减去。
C
有 nnn 种不同颜色的球,第 iii 种颜色的球有 aia_iai 个。
这些球可以被组合成若干组。每组最多包含 222 个球,并且每组中每种颜色的球最多只能有 111 个。
考虑所有 2n2^n2n 种颜色集合。对于某个颜色集合,定义其值为用这些颜色的球能分成的最少组数。例如,若有三种颜色,球的数量分别为 333、111 和 777,则这些球最少能组合成 777 组(且不能更少),所以该颜色集合的值为 777。
你的任务是计算所有 2n2^n2n 种颜色集合的值之和。由于答案可能很大,请输出其对 998 244 353998\,244\,353998244353 取模的结果。
考虑对于一种颜色集合 AAA,容易发现它的值为 max(⌈∑x∈Ax2⌉,maxx∈Ax)\max(\lceil\frac{\sum_{x\in A} x}{2}\rceil,\max_{x\in A}x)max(⌈2∑x∈Ax⌉,maxx∈Ax),解释一下,就是我们肯定不会想让一个颜色单独配对,然而我们如果贪心的去搞,如果所有其它元素的和都无法超过这个这个集合中最多的数的个数,那么肯定是让别的与它配对,然后最后剩下来一点单独搞,否则一定存在某个方案去完美配对(当然如果是奇数会剩下来一个数)。
然后显然让人想枚举这两个数中的一个,前一个看着就不好枚举,考虑枚举后一个,那么我们就要算 ⌈∑x∈Ax2⌉≥maxx∈Ax\lceil\frac{\sum_{x\in A} x}{2}\rceil\ge\max_{x\in A}x⌈2∑x∈Ax⌉≥maxx∈Ax 的方案数,这个东西直接背包处理方案数即可。
D
怪物正在逼近城市,为了保护它,Akito 必须在城市周围创建一个防护场。众所周知,防护场有不同的等级。Akito 选择了等级为 nnn 的防护场。为了构建这个防护场,需要一个特殊咒语,即伟大魔法三角(表示为二维数组 TTT)的第 nnn 行。我们将这个数组称为 TTT。
魔法三角的定义如下:
- 第 iii 行包含 iii 个整数。
- 第一行唯一的整数是 kkk。
- 设第 iii 行第 jjj 个元素为 Ti,jT_{i,j}Ti,j,则:
Ti,j={Ti−1,j−1⊕Ti−1,j,if 1<j<iTi−1,j,if j=1Ti−1,j−1,if j=i T_{i,j} = \begin{cases} T_{i-1,j-1} \oplus T_{i-1,j}, & \text{if } 1 < j < i \\ T_{i-1,j}, & \text{if } j = 1 \\ T_{i-1,j-1}, & \text{if } j = i \end{cases} Ti,j=⎩⎨⎧Ti−1,j−1⊕Ti−1,j,Ti−1,j,Ti−1,j−1,if 1<j<iif j=1if j=i
其中 a⊕ba \oplus ba⊕b 表示整数 aaa 和 bbb 的按位异或运算。
请帮助 Akito 在怪物抵达城市前找到这个无限魔法三角的第 nnn 行整数。
不难发现 TTT 中的值只可能是 000 或 kkk,于是 kkk 具体是什么与题目无关了,考虑直接令 k=1k=1k=1,注意到异或可以理解为不进位加法,于是改一改你就会发现,这就是组合数递推的杨辉三角。然后组合数计算即可。
一个比较妙的地方是注意到是杨辉三角,当然这题很简单,但是如果给个卡特兰数就很难了。
E
先考虑没有任何限制怎么做,不难发现由于每个烹饪方法最多做一个菜,而这个选择的形式很像背包,设 f(i,j)f(i,j)f(i,j) 表示前 iii 个烹饪方式,做 jjj 道菜的方案数,总的转移复杂度是 O(n2)O(n^2)O(n2) 的。
至多在一半的菜种出现不好做,因为我们不好处理到底哪个数最多,但是某个食材至少出现多少次是好做的,因为如果那个菜在大于一般的菜种出现,最多只会有一个,枚举它。
然后考虑它要大于一般的总数。这意味着我们要将总数和它的数量一起放入状态,设 f(i,j,k)f(i,j,k)f(i,j,k) 表示枚举的主要食材 xxx 做了 kkk 道菜,其他与上面的一样的方案数。直接暴力转移是 O(n3)O(n^3)O(n3) 的。
考虑优化,我们发现判定条件是 k>j2k>\frac{j}{2}k>2j,这不好,倍比关系不好,但是和差关系好,类比中位数,我们可以很好地处理和差关系,但是对于倍比关系就没那么好了。于是启发我们去修改状态。我们发现上述式子可以化成:k−j2>0k-\frac{j}{2}>0k−2j>0,直接这么压也不是不行,你把每 12\frac{1}{2}21 的差设为状态,但是这不好。我们发现,理解一下现实意义,不难发现这相当于你要求 xxx 做的菜数比其他加起来还多,于是你把这两个的差压起来就好了。我觉得这还是比较好想到的,比起我之前见过的:随机序列的最长公共前缀看成加入一个赌徒去随机丢色子好多了。