题解 CF1713F【Lost Array】
先考虑第 行到第 列是怎么推的?
首先,为了方便将第 行的数从右往左重标号为 。我们发现 对于 的贡献是 ,根据 定理可得有贡献当且仅当 。
考虑容斥,枚举 ,钦定 在二进制下为 的超集,则 向 被贡献次数为 。于是,直接异或即可。
所以,我们先考虑求出 表示 为超集的数的异或和( 为 的高维后缀异或和)。
考虑枚举 ,于是, 的值即为 ( 为 的高维前缀异或和)。
综上,我们发现,从第 行推到第 列是对 先做一遍高维后缀异或和,再做一遍高维前缀异或和。
考虑从第 列如何反推第 行?
直接倒过来做,先对 做一遍高维前缀差分异或和,再做一遍高维后缀差分异或和。(因为是在异或运算下,所以前缀和和前缀差分、后缀和和后缀差分都分别是一个东西)。
const int N = 5e5 + 10;
int a[N];
signed main() {
int n; read(n);
for (int i = 0; i < n; ++i) read(a[i]);
int lg = log2(n);
F(i, 0, lg)
for (int j = 0; j < n; ++j)
if ((j >> i) & 1) a[j] ^= a[j - (1 << i)];
F(i, 0, lg)
for (int j = 0; j < n; ++j)
if ((j >> i) & 1) a[j - (1 << i)] ^= a[j];
for (int i = n - 1; ~i; --i) writes(a[i]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构