[ARC137D] Prefix XORs 题解

思路#

考虑前缀和时每一位的贡献是什么。

对于一个生成函数 F(x)

对其作 k 次前缀和,函数会变成:

(11x)kF(x)

那么其 n 次项系数:

=[xn](11x)kF(x)=[xn]F(x)(1x)k=i=0(ki)(1)i[xni]F(x)=i=0(k+i1i)[xni]F(x)

这样就求出了系数为 (k+i1i)

注意到以上是在二进制每一位考虑。

所以只有 (k+i1i)mod2=1 时才有贡献。

依据 Lucas 定理,当 ik+i1 子集时,答案为一。

所以最终答案为:

ansi=j=0[j(i+j1)]anj

我们将 i 集体减一。

ansi=j=0[j(i+j)]anj=j=0[ji=]anj

容易发现是一个高维前缀和,直接做即可。

时间复杂度:O(nlogn)

Code#

#include <bits/stdc++.h>
using namespace std;

int n, m;
int a[1 << 20];
int b[1 << 20];

int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> a[i];
  int k = 1 << 20;
  for (int i = 0; i < k; i++)
    if (i < n) b[i] = a[n - i];
  for (int i = 0; i < 20; i++)
    for (int j = 0; j < k; j++)
      if (j & (1 << i)) b[j] ^= b[j ^ (1 << i)];
  for (int i = 0; i < m; i++)
    cout << b[i ^ (k - 1)] << " \n"[i == m - 1];
}

作者:JiaY19

出处:https://www.cnblogs.com/JiaY19/p/18501701

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   JiaY19  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示