P3773 [CTSC2017]吉夫特
考虑什么时候 \(\binom{n}{m}\equiv 1(\bmod 2)\),由 Lucas 定理,我们知道
\[\binom{n}{m}\equiv \binom{\lfloor\frac{n}{2}\rfloor}{\lfloor\frac{m}{2}\rfloor}\binom{n \% 2}{m \% 2}
\]
而后面一项除了 \(\binom{0}{1}\) 以外都等于 \(1\),前面一项相当于二进制位右移一位。
所以我们考虑 \(n,m\) 对应二进制位,若存在 \(n,m\) 分别是 \(0,1\) 就不合法,否则都合法。
发现这相当于 \(m\subseteq n\)。
那么我们现在来考虑怎么计数,如果记 \(f_i\) 是以 \(i\) 结尾的序列的个数的话,我们有:
\[f_i=\sum_{j<i\\a_i\subseteq a_j}f_j
\]
我们考虑按下标顺序转移,这样可以忽略掉第一个限制,只用处理第二个限制。我们可以枚举子集做就完了。
\(O(3^{\log_2 \max a_i})\)。
同时,我们注意到这个 dp 是没有加任何优化的,我们可以考虑优化查询第二个限制。
我们观察到子集关系构成一张 DAG,似乎没什么手段好用。
我们可以考虑分块,把每个数分成二进制位下前若干位和后若干位。
相当于是支持在一个位置上修改值,查询超集的和。
我们可以考虑维护一个 \(sum_{i,j}\) 表示前面是 \(i\),后面是 \(j\) 的超集的和。
每次查询时枚举 \(i\),每次修改时枚举 \(j\)。
复杂度 \(O(n\sqrt{\max{a_i}})\)。