给$n$个数字($<2{m}$),求$2^n$取法,异或起来。询问$ans[0..m]=[popcount()=m]$,$m\leq 35,n\leq 2\times 2\times10^5$
$Sooke$牛逼啊。
- 可以用线性基知道能表示出哪些数字。显然枚举$2^m$,不可能。
考虑$m=35$,考虑折半搜索。
找出前${\frac{m}{2}}$位,可以表达出来的数字$f1[i]$。
然后再找出后${\frac{m}{2}}$位,可以表达出来的数字$f2[cnt[i]][i]$。$cnt[i]$为$i$中二进制1的个数。
- 由于第一组后$m/2$为$0$。不影响后${\frac{m}{2}}$位的个数。
- 对两组的前$m/2$位$FWT$,$ans[i+j]+=[cnt[FWT(f2[j],f1)]=i]$
最后由于线性基的性质,$\times 2^{n-size}$
代码
1 |
|