[ZJOI2016]小星星
容斥是官方做法,不过用集合并卷积也可以推出同样的dp式子。
树形dp,令(f_{x,i,S})表示以(x)为根的子树,(x)映射到(i),子树全体映射到(S)的合法方案数。
考虑给当前的(x)添加一个以(y)为根的子树,令新的以(x)为根的(dp)数组为(f'),有:
[f'_{x,i,S}=sum_{(i,j)in E}sum_{Acup B=S,Acap B=emptyset}f_{x,i,A}f_{y,j,B}
]
枚举合法的(i,j),余下的就是一个看上去像子集卷积的东西。
然而最终只需要(S)为全集的方案,如果(A)与(B)有交,那么(Acup B)必然小于新的(x)的子树大小,最终不可能对答案产生贡献。
于是考虑去掉(Acap B=emptyset)的限制,仍然保证答案的正确性,转化为集合并卷积:
[f'_{x,i,S}=sum_{(i,j)in E}sum_{Acup B=S}f_{x,i,A}f_{y,j,B}
]
于是令(hat f)表示(f)对最后一维做莫比乌斯变换之后的结果,有:
[hat f'_{x,i,S}=hat f_{x,i,S}sum_{(i,j)in E}hat f_{y,j,S}
]
初始状态下(f_{x,i,S}=[S={i}]),很容易得到莫比乌斯变换之后的结果。dp中不需要进行反演,保留莫比乌斯变换后的形式计算即可。
最后将根的全集方案数用莫比乌斯逆变换的公式算出来即可,复杂度也是(O(n^32^n))。