显然如果 x 能到达 y 一定有 y⊆x,则我们只需要关心 x−y 的值 z。
然后对于一个 z,方案数显然是 popc(z)!,因为每次走一条边相当于把 z 中的某一位 1→0。
现在只需要计算对于一个 z,可以得到这个 z 的 (x,y) 对的数量,显然是 2n−popc(z),因为对于某一位,如果 x,y 在这一位上相同,可以都填 0/1。
于是我们考虑枚举 popc(z),则对应的 z 就有 (popc(z)n) 种。整合一下得到式子:
ans(n)=k=0∑n(kn)k!2n−k
可以 O(n) 单次计算。把二项式展开可以得到:
ans(n)=k=0∑n(n−k)!k!n!k!2n−k=k=0∑n(n−k)!n!2n−k=n!k=0∑n(n−k)!2n−k=n!k=0∑nk!2k
预处理前缀和即可,可以做到 O(n+T)。
去掉 x=y 以及 y=0 的贡献是简单的,这里不再赘述。