「笔记」一些组合题
Posted at 19-8-5 20:26, Updated at 19-10-6 21:57
来自qrsikno的课件
AGC002F Leftmost Ball
Description
给定 种颜色, 每种颜色有 个球.
现在把他们排列成一行, 再把每种颜色第一个染成 0 号颜色 (之前未出现).
求经过操作之后能有多少种不同的序列.
两个序列不同被认为是长度不同或某个位置颜色不同.
Solution
[动态规划] [计数] [组合数学]
因为颜色等价,可以忽略颜色的排列顺序,最后乘上
和其他颜色放一起填,需要保证任意前缀都有
表示当前填了个,种颜色的方案数,每次把一种颜色全部加进来
的系数为是因为必须钦定放在当前第一个空位,否则会算重
组合数上面最后一项同理,钦定第一个数填在第一个空位上
下面是要减去和当前颜色的第一个数
Luogu P1758 管道取珠
Solution
[计数]
可以看成两个完全一样的游戏同时进行,它们得到了相同的串的方案数
设表示第一个游戏进行到,第二个进行到的方案数
显然,复杂度
CF1111D Destory the Colony
Description
给定一个偶数长度 的字符串, 只包含大小写字母.
有 次询问, 每次指定两个位置, 要求通过交换字符, 使这两个位置上的类型的字符在字符串中线同一边(要么全在左半边,要么全在右半边).
并且对于其他类型的字符, 不能跨过串的中线 (也就是说必须在一边, 但是可以不跟指定的字符一边).
询问之间独立, 求方案数模 的值
Solution
[动态规划] [退背包]
先不考虑指定的两个位置的限制
枚举表示放在左半边的字符的集合
根据可重排列计数,的答案就是:
发现与具体是什么无关
因为有,所以需要做一次背包求出方案数,再乘上面那个东西就是答案
然后考虑指定了位置怎么做
可能的很少,可以把答案都预处理
显然,只需要把和在背包中挖掉即可
1 | for (int k = Cnt[i]; k <= N / 2; ++k) |
并且答案要乘,因为和可以同时在左半边或者右半边
CF785D Anton and School 2
Description
[范德蒙德卷积]
Solution
a