1 条题解

  • 0
    @ 2025-8-24 22:30:42

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Mivik
    AFO

    搬运于2025-08-24 22:30:42,当前版本为作者最后更新于2021-04-15 23:54:00,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    Subtask 1

    一共只有 nn 种选择方案,直接统计并输出即可。

    Subtask 2

    fi,j,kf_{i,j,k} 为考虑了前 ii 个数,用到了 jj 个,异或值为 kk 的方案数。直接 O(2wn2)O(2^wn^2) 暴力转移即可。

    Subtask 3

    先不考虑不能选同一个数的条件,那么令 cic_iii 在给定的数中的出现次数,答案就是 ccc*c* 是异或卷积)。用 FWT\mathrm{FWT} 算出这个后我们再减去选到同一个数的情况就好了。

    Subtask 4

    下文我们令 L=2wL=2^w。定义一个序列的权值向量为一个长度为 LL 的向量,其中序列的第 ii 位为 ii 在原序列中出现的次数;并额外定义一个数 cc 的权值向量就是 [c][c] 的权值向量。那么 kk 个数的异或就是它们的权值向量 FWT\mathrm{FWT} 后逐位相乘再 FWT\mathrm{FWT} 回去。然后我们对这个向量逐位考虑。根据 FWT\mathrm{FWT} 的定义我们知道

    $$\mathrm{FWT}(v)_i=\sum_{j=0}^{L-1}(-1)^{\mathrm{pop}(i\&j)}v_j $$

    其中 pop(v)\mathrm{pop}(v)vv 二进制下 11 的个数,i&ji\&j 是位与(Bit-And)运算。其次我们知道 FWT\mathrm{FWT} 是一个线性变换,也就是说 FWT(a)+FWT(b)=FWT(a+b)\mathrm{FWT}(a)+\mathrm{FWT}(b)=\mathrm{FWT}(a+b),我们要算答案可以把所有情况的 FWT\mathrm{FWT} 加起来得到答案的 FWT\mathrm{FWT}

    不难发现一个正整数的权值向量 FWT\mathrm{FWT} 后每一项只能是 ±1\pm1。对于答案 FWT\mathrm{FWT} 中的每一个位置,我们相当于是要从一些 111-1 中选出 mm 个,然后算乘积,并对所有方案求和。假设我们知道这一个位置上有 aa1-1(na)(n-a)11,于是答案的 FWT\mathrm{FWT} 上这一位的值就是

    $$\begin{aligned} &[x^m](1-x)^a(1+x)^{n-a}\\ =&\sum_{i=0}^m(-1)^i\binom ai\binom{n-a}{m-i} \end{aligned} $$

    这个可以 O(m)O(m) 计算。现在问题是我们怎么对每一个位置都算出 aa。不难发现每一个位置上面数的和是

    si=j=1n(1)pop(i&vj)s_i=\sum_{j=1}^n(-1)^{\mathrm{pop}(i\&v_j)}

    这个是可以一遍 FWT\mathrm{FWT} 算出来的,然后解一下方程就可以知道 aa 了。于是我们就可以 O(Lm)O(Lm) 得到答案的 FWT\mathrm{FWT},然后 O(Lw)O(Lw) 得到答案。总时间复杂度 O(Lm)O(Lm)

    Subtask 5

    不难发现我们可以对每一个可能的 aa(即 [0,n][0,n] 间任意整数)用 FFT\mathrm{FFT} 预处理出上面那个式子的值,于是我们就在 O(nlogn+Lw)O(n\log n+Lw) 的时间复杂度内通过了这一 Subtask。

    Subtask 6

    好耶,是防 AK

    不难发现上面那个式子是关于 aa 的一个 mm 次多项式,我们可以预先对 a[0,m]a\in[0,m] 求出点值然后插值得到多项式,最后我们再多点求值求至多 LL 个点值即可。

    不过我们注意到由于 nn10910^9 级别,我们没法以朴素形式为基础直接卷积得到点值,于是我们对原式变形:

    $$\begin{aligned} &\sum_{i=0}^m(-1)^i\binom ai\binom{n-a}{m-i}\\ =&\sum_{i=0}^m(-1)^i\frac{a!(n-a)!}{i!(a-i)!(m-i)!(n-a-m+i)!}\\ =&a!\sum_{i=0}^m\frac{(-1)^i}{i!(m-i)!}\frac{(n-a)^{\underline{m-i}}}{(a-i)!}\\ =&\frac{a!}{n^{\underline a}}\sum_{i=0}^m\frac{(-1)^i}{i!(m-i)!}\frac{n^{\underline{m+(a-i)}}}{(a-i)!} \end{aligned} $$

    于是就可以正常卷积了。时间复杂度 O(mlog2m+Lw)O(m\log^2m+Lw)

    mivik.h / 98 分代码 / 满分代码

    • 1

    信息

    ID
    6642
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者