[ABC310D] Peaceful Teams
考虑状压 DP。
令 \(f[i][S'][S]\) 表示已经分配到了第 \(i\) 组,且该组的人集合为 \(S'\),分配过的人集合为 \(S\) 方案数。
假设加入一个人\(j\),则 \(f[i][S'][S]->f[i][S'|j][S|j]\)(当然需要满足一定条件)
或者加入之后新分了一组,则 \(f[i][S'][S]->f[i+1][j][S|j]\)(当然需要满足一定条件)
状态中的 \(j\) 注意转换成二进制的幂次。
答案为 \(f[n][any][all]\),其中 \(any\) 满足不为 \(0\),\(all\) 为所有人都分配,即 \(2^n-1\)。
注意需要最后除以排列总数 \(t!\),还需保证每组内编号上升(跨组任意),不然会算重。
初始状态 \(f[0][0][0]=1\)。
复杂度 \(O(tn4^n)\)。