题解:AT_agc050_f [AGC050F] NAND Tree
该做法支持模数任意给定。
注意到
- 当点集大小
>1 时选择一条边: -
- 若染色为蓝边,答案乘以
-1 ,然后对两个点集分别染色问题。
- 若染色为蓝边,答案乘以
-
- 若染色为红边,终止该点集的染色。
- 否则将答案乘以
a_u 。
那我们要对染色过程计算权值和,考虑删去所有蓝边,则每部分应该由一个点或者一条红边加上若干条未被染色的边。
那考虑染色顺序,相当于红边在它所在的部分一定是最后被染色的,并且比它周围的蓝边染色都要早。
那考虑对这个过程计数,设
考虑转移,对于该边为红边/白边的情形可以直接枚举这条红边在两部分的排名;对于蓝边的情形,对该点为单点的情况转移也是简单的,对于转移
代码:link。