[CF453D]Little Pony and Elements of Harmony

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

题目

  点这里看题目。

分析

  设 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(uv)
  看一看每次转移,我们发现最不友好的东西就是 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]=va[uv]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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值