「postOI」Lost Array

题意

有一个序列 A={a1,a2,...,an},按如下方式构造一个 (n+1)×(n+1) 的矩阵 B

  • Bi0=00in);
  • B0i=ai1in);
  • Bij=B(i1)j xor Bi(j1)1i,jn)。

现在给出 B1n,B2n,...,Bnn(也就是最后一,但是没有 B0n),求出 A

n5×105

解析

题目给出的是 B 的递推式,我们希望得到计算式,换句话说,我们希望直接得到 Bin 只与 A 有关的表达式。

倒过来想,考虑 aiBjn 的贡献。由于是异或,ai 只可能贡献 ai0

那具体贡献多少?我们可以把问题具象化,B 的递推式相当于是“向左走一步或向上走一步”。那么只需要判断从 Bjn 走到 B0i 的方案数是奇数还是偶数。这里有一个小细节——“走到 B0i 就结束了,不能继续走到 B0(i1)”,这个细节相当于说最后一步一定是向上的

这样我们就可以通过组合数算出 BjnB0i 的方案数:

((ni)+(j1)j1)

这样并不好看,我们设 ai=anibi=Bi+1,n。那么 aibj 的贡献只需要看 (i+jj) 的奇偶性。关于组合数的奇偶性,结论如下:

(ab) 为奇数当且仅当 a and b=b

也就是说 aibj 有贡献当且仅当 (i+j) and j=j 等价于 i and j=0

bj=i and j=0ai

似乎有一个做法,如果把 j 取个补集,那条件不就是 iji and j=i),那么

bj=ijai

b 不就是 a 做了或卷积 FWT 的结果吗?然而,由于 n 未必是 2 的整次方,b0,b1,...,bn1 中有几项我们不知道。这个方法就这么废了……

我们再考虑一下 i and j 能怎么处理——容斥?我们钦定 i 对应的二进制位全为 1,即 i and j=i,记为 ci

ci=ijaj

则由容斥可得下式(容斥的正负系数在异或中没有意义)

bi=jicj

唔,看起来好像没什么区别,还更麻烦了?先分析一下,由于 ci 是计算 i 的超集的异或和,那么当 in 时,ci=0。于是我们只需要计算 c0,c1,...,cn1,那么我们可以通过 b 计算出这些结果吗?

当然是可以的——因为这是或卷积的 fwt,计算 bi 只需要用到 jicj,那么就可以通过 b0 (n1) 做一遍或卷积 fmt 求出 c0 (n1)

最后再用完整的 c 做一遍与卷积 fmt 求得 a

源代码

Copy#include <cstdio>
#include <cstring>
#include <algorithm>
const int MAXN = (int)5e5 + 10;
int len, lg2_len;
int arr[MAXN];
void fwtOr()
{
    for (int i = 0; i <= lg2_len; ++i)
    {
        for (int j = 0; j < len; ++j)
        {
            if (j & (1 << i))
            {
                arr[j] ^= arr[j ^ (1 << i)];
            }
        }
    }
}
void fwtAnd()
{
    for (int i = 0; i <= lg2_len; ++i)
    {
        for (int j = 0; j < len; ++j)
        {
            if (j & (1 << i))
            {
                arr[j ^ (1 << i)] ^= arr[j];
            }
        }
    }
}
int main()
{
    scanf("%d", &len);
    for (int i = 0; i < len; ++i)
    {
        scanf("%d", &arr[i]);
    }
    while ((1 << lg2_len) < len)
    {
        ++lg2_len;
    }
   
    fwtOr();
    fwtAnd();
    for (int i = 1; i < len; ++i)
    {
        printf("%d ", arr[len - i]);
    }
    printf("%d\n", arr[0]);
    return 0;
}
posted @   Lucky_Glass  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2018-09-01 【例题收藏】◇例题·V◇ Gap
TOP BOTTOM
点击右上角即可分享
微信分享提示