CF2134F Permutation Oddness
题目描述
给定四个正整数 $c_0$、$c_1$、$c_2$ 和 $c_3$。
令 $n = c_0 + c_1 + c_2 + c_3$。现在有一个长度为 $n$ 的数组 $a$,其中 $x$($0\le x\le 3$)在 $a$ 中出现了 $c_x$ 次。对于数组 $a$ 的任意一个**不同排列**$^{\text{∗}}$ $b$,定义其奇异度为$^{\text{†}}$ $^{\text{‡}}$:
$$
\sum_{i = 1}^{n-1} \text{lowbit}(b_i \oplus b_{i+1})
$$
你的任务是,对于每一个 $k$ 从 $0$ 到 $2 \cdot (n-1)$(包含),计算出奇异度等于 $k$ 的 $a$ 的不同排列的个数。
由于答案可能非常大,只需输出对 $10^9+7$ 取模后的结果。
$^{\text{∗}}$数组的一个排列是将其所有元素按照任意顺序重新排列。例如,$[1,2,2]$ 是 $[2,2,1]$ 的一个排列,但 $[1,1,2]$ 不是。如果两个排列中存在至少一个位置不同,则认为它们是不同的。
$^{\text{†}}$ $\oplus$ 表示[按位异或运算](https://en.wikipedia.org/wiki/Bitwise_operation#XOR)。
$^{\text{‡}}$ $\text{lowbit}(x)$ 为 $x$ 的二进制下最低位(即最低的非零位对应的 $2^k$),例如 $\text{lowbit}(12)=4$,$\text{lowbit}(8)=8$。特别地,规定 $\text{lowbit}(0)=0$。
输入格式
每组测试数据包含多组测试用例。第一行包含一个整数 $t$($1 \le t \le 50$),表示测试用例的数量。每组测试用例一行,包含四个正整数 $c_0$、$c_1$、$c_2$ 和 $c_3$($1 \le c_0, c_1, c_2, c_3 < 800$,$4 \le c_0 + c_1 + c_2 + c_3 \le 800$)。
令 $n = c_0 + c_1 + c_2 + c_3$。保证所有测试用例的 $n$ 之和不超过 $800$。
输出格式
对于每个测试用例,输出一行 $2 \cdot (n-1) + 1$ 个整数,分别表示奇异度为 $0,1,\ldots, 2 \cdot (n-1)$ 的不同排列数,答案对 $10^9+7$ 取模。
说明/提示
在第一个测试用例中,数组 $a$ 有 $24$ 个不同排列。下表为部分排列的奇异度值:
| 排列 | 奇异度 |
| --- | --- |
| $[0,1,2,3]$ | $\text{lowbit}(0 \oplus 1) + \text{lowbit}(1 \oplus 2) + \text{lowbit}(2 \oplus 3) = 1 + 1 + 1 = 3$ |
| $[0,2,1,3]$ | $\text{lowbit}(0 \oplus 2) + \text{lowbit}(2 \oplus 1) + \text{lowbit}(1 \oplus 3) = 2 + 1 + 2 = 5$ |
| $[0,1,3,2]$ | $\text{lowbit}(0 \oplus 1) + \text{lowbit}(1 \oplus 3) + \text{lowbit}(3 \oplus 2) = 1 + 2 + 1 = 4$ |
统计这 $24$ 个排列:
- 有 $8$ 个排列奇异度为 $3$。
- 有 $8$ 个排列奇异度为 $4$。
- 有 $8$ 个排列奇异度为 $5$。
在第二个测试用例中,数组 $a$ 的不同排列数为 $840$,奇异度分布如下:
- $8$ 个排列奇异度为 $3$。
- $32$ 个排列奇异度为 $4$。
- $126$ 个排列奇异度为 $5$。
- $184$ 个排列奇异度为 $6$。
- $244$ 个排列奇异度为 $7$。
- $156$ 个排列奇异度为 $8$。
- $72$ 个排列奇异度为 $9$。
- $18$ 个排列奇异度为 $10$。
由 ChatGPT 5 翻译