题面

洛谷链接

原题地址

思路

首先很难过的告诉你这是道纯纯的板子题,但又不是蠢蠢的板子题

你需要对板子有一定的理解才行

首先处理一下输入,重定义 $s_i$ 为值为 $i$ 的数量

然后只要你够熟悉板子,就知道可以分别 FST, FWT 卷积一下就可以求出

$(s_a | s_b),(s_d \bigotimes s_e)$ 的各种方案的数量 注: $s_a\& s_b = 0$

稍加思索,数量乘上对应的斐波那契值就是该二进制对应的权值

记 $(s_a | s_b),s_a \& s_b = 0$ 的权值数组为 $aor$

记 $(s_d \bigotimes s_e)$ 的权值数组为 $axor$

再把 $s$ 数组乘上斐波那契也变成权值

求 $aor_a \& s_b \& axor_c = 2^i$

我第一个想法是枚举这个 $i$ 此时所需考虑的即第 $i$ 位为 1 的 $a,b,c$

把 $a,b,c$ 的第 $i$ 位去掉,再做子集卷积即可满足要求

复杂度 $O(17\times 16^2 2^{16})$

时限 4s 该做法就 4.5s TLE (菜得不会卡常)

这我就迷惑了,听说 $3^n$ 都给暴艹过去我这怎么不行

然后仔细再看 $A_j \& B_k = 2^i$

发现在做子集卷积的时候,只要满足或起来的位数比状态位数恰好多一位即可

fwt[__builtin_popcount(i)+1][i] 懂的都懂

复杂度就是子集卷积的复杂度 $O(n^2 2^n)$

代码

都是板子,主要看 main()

另附上述 4.5s TLE 代码