题目
点这里看题目。
分析
设 c o u n t ( x ) count(x) count(x)为 x x x的二进制中 1 1 1的个数。因此 f ( u , v ) = c o u n t ( u ⊕ v ) f(u,v)=count(u\oplus v) f(u,v)=count(u⊕v)
看一看每次转移,我们发现最不友好的东西就是 f ( u , v ) f(u,v) f(u,v),因此我们得想办法把它从我们的计算中丢掉。
发现对于 [ 0 , n ) [0,n) [0,n)中的所有数,两两异或之后不会超过 n n n。并且对于一个固定的数 x x x,其 c o u n t ( x ) count(x) count(x)是不会变的。因此我们考虑将 b b b数组转存出来:
a [ i ] = b [ c o u n t ( i ) ] a[i]=b[count(i)] a[i]=b[count(i)]
因此有:
e [ u ] = ∑ v a [ u ⊕ v ] e [ v ] e[u]=\sum_v a[u\oplus v]e[v] e[u]=v∑a[u⊕v]e[v]
考虑改变枚举顺序:
e [ u ] = ∑ v a [ u ⊕ v ] e [ v ] = ∑ i = 0 m a [ i ] ∑ u ⊕ v = i e [ v ] = ∑ i = 0 m a [ i ] ∑ v ⊕ i = u e [ v ] = ∑ v ⊕ i = u a [ i ] e [ v ] \begin{aligned} e[u] &=\sum_v a[u\oplus v]e[v]\\ &=\sum_{i=0}^ma[i]\sum_{u\oplus v=i}e[v]\\ &=\sum_{i=0}^m a[i]\sum_{v\oplus i=u}e[v]\\ &=\sum_{v\oplus i=u}a[i]e[v]\end{aligned} e[u]

这篇博客详细介绍了如何利用FWT(快速傅里叶变换)优化异或卷积,针对CF453D问题进行分析,通过转换数组并利用异或的性质,将问题转化为异或卷积形式,再结合快速幂和模运算处理模数问题,最终给出解决方案,适合算法学习者参考。
最低0.47元/天 解锁文章
586

被折叠的 条评论
为什么被折叠?



