JSOI2016位运算(容斥+矩阵+数位dp)

题目链接:P5772 [JSOI2016]位运算

本文参考自神\(Itst\)的题解

题意简述:给定一个二进制位\(01\)字符串\(R\),它是由一个字符串循环\(k\)遍得到的,你要选\(n\)个互不相同数\(\in[0,R-1]\),使得异或和为\(0\).求有多少方案,对\(1e9 + 7\)取模

\(|S| \leq 50,k \leq 1e5,n \leq 7\)

\(\quad\)我们考虑将限制放宽到可以重复,并且有序,然后再考虑容斥.设原问题答案是\(ans_n\),设新问题答案是\(f_n\),我们考虑枚举集合划分.那么设奇数大小的集合有\(c_0\)个,偶数有\(c_1\)个.那么\(ans_n\) = \(f_n\) - \(\sum ans_{c_0} * A(n-c_0,c1)\).递归下去即可,这部分时间复杂度是\(O(\sum i * Bell(i))\)

\(\quad\)那么考虑\(f_n\)怎么算,对于每个\(n\),我们考虑一个\(dp_{n,bit,lim}\),表示当前\(dp\)\(bit\)位还有\(lim\)个数被最高位限制,总共有\(n\)个数.那么\(f_n\) = \(dp_{n,bit,n}\).因为\(|S|,n\)很小,考虑矩阵快速幂优化.那么时间复杂度是\(O(n^4*(\log k \ + \ |S|))\)

代码先咕咕

posted @ 2021-03-07 21:52  y_dove  阅读(117)  评论(0编辑  收藏  举报