前言
赛时没有做出来,然后赛后被队友嘲讽说是简单题,还搞了一堆奇奇怪怪的容斥加减......
我认为都是假的,毕竟计数的难点并不在于设计怎样的状态,而在于怎么不算重,我在赛时已经想过很多容斥了,要么会算重,要么就是无法通过的。经过了两天的思考,直到自己真正把这题弄出来后,我方才发现这是一个很巧妙的题,从朴素的暴力到正解这一过程绝对不是平凡的,而是很复杂的
谨以此文记录这一不轻易想到的巧妙的思路
赛时的思路
注意到题目要求的是可重集对数,因此我需要知道左右两边的可重集合里有多少种元素后还需要用一个组合数来求解
最朴素的暴力,枚举左边的集合出现了哪些数字,然后想办法处理一下左边点对于右边选数字会产生那些影响与限制,就是两种:
(a)右边集合的某些数字必选,记这些点的集合为 \(\mathbb T\)
(b)有若干个形如 "a[i],b[i]中至少选一个的" 的限制
我们将题目中的 a[i],b[i] 限制放在图上,相当于给点连边,那么看看这两种限制是怎么产生的
如果在原来的图中某条边连接的两个点其中一个出现在左边的集合中,而另外一个没有出现,那么另外一个就必须出现在右边的集合中,这是限制 (a)
如果在原来的图中某条边连接的两个点都出现在了左边的集合里,那么这条边就转化成了 (b) 限制,
如果在原来的图中某条边连接的两个点都没有出现在左边的集合里,那么这样的左边的集合是不合法的