[CF453D]Little Pony and Elements of Harmony

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

  点这里看题目。

分析

  设 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 ] =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值