感觉我的转化比较神秘,但是和官方题解应该本质一样。
手玩可以发现当 ax=2x+2y,ay=2y+2z,az=2x+2z 时是无法钦定出操作顺序的,而此时这个数据又形成了类似于环状的结果,所以考虑将 a 和操作顺序的 DAG 一一对应,下面令 ai→aj 表示 ai 的操作在 aj 之后。注意是状态作为图上的点而不是编号,比如说当 a1=a2=a3=7 时,a1,a2,a3 三个小点本质上相同,若连成完全图显然会有环,由于是同时操作,所以直接合并成一个大点即可。因此两个大点 u,v 之间可以有 2sizu 种连边方法,分别对应了 v 的 sizv 个小点的 2sizu 种 a。
不难发现 ai 一定是所有 i∋ax 中最晚操作的,所以将 ai 连向所有的 x,i∋ax,会发现 sizx=1 的 x 还需要确定是 ax=0 还是 ax=2x,这两种情况在 DAG 上都是孤立点,其他情况都已经完成了一一对应。接下来一步就比较神秘,可以将所有 ax=2x 的点最后再确定,在 DAG 上的孤立点都钦定为 ax=0。(这一步没看懂可以现继续往下看,最后就明白了)
dp 求 DAG 的过程本质就是将相同状态的小点合并成大点,然后对大点做 DAG 有标号计数。令 fi 表示有 i 个小点的方案数,则转移枚举原来的小点数量 j 和新形成的大点数量 k:
fi=j=0∑i−1k=1∑i−j(−1)k−1fj(ji){ki−j}2jk
因为上面说过要特殊处理,所以当前的 dp 中是假设所有的 sizx=1 孤立点都是 ax=0,为了计数 ax=2x 的情况,答案并不是 fn,而是 ∑i=0n(in)fi,表示选出的 i 个做 DAG 的 dp,剩余的 n−i 个点都是 ax=2x。时间复杂度为 O(n2)。