1 条题解

  • 2
    @ 2021-8-1 17:29:58

    首先可以定义一个类型,代表一个变量,进行加减乘法时候自动输出对应指令。这样就可以直接替代 int 用。但是注意如果有些地方(例如某个常量的某个常量幂)还是最好在程序内计算,输出对应值。
    对常量,可能某个常量用很多次,再在初始化这个变量类型的时候判断这个常量是否已经在某个内存位置存在,如果存在就不要重新初始化。

    算法 1

    纯暴力。操作用量 2nq2nq,期望得分 1111 分。

    算法 2

    修改完计算 NTT,询问直接找,操作用量 4nlogn4n\log n,期望得分 1919 分。

    算法 3

    考虑融化算法 1 和算法 2。我们定期重构 NTT 表,然后计算上一次重构之后的修改对当前询问的贡献。设每 BB 个修改重构,则操作用量是 O(n2lognB+nB)=O(nnlogn)O(\frac{n^2\log n}B+nB)=O(n\sqrt{n\log n}),期望得分 5353 分。

    算法 4

    魔法开始。

    定义 f(x)f(x) 为一个多项式,fi(x)f_i(x) 为这个多项式的每 262^6 项提取出来第 ii 项所产生的多项式,其中第 ii 项为 xix^i 的系数。则:

    $$f(3^{\frac{998244352}{2^{12}}x})=\sum_{i=0}^{2^6-1}3^{\frac{998244352}{2^{12}}xi}f_i(3^{\frac{998244352}{2^6}x}) $$

    感性理解以下,可以看做为广义一下的 FFT。
    每一个 fif_i 仅可能用到的处为 399824435226x3^{\frac{998244352}{2^6}x},这只有 262^6 可能的值,每一次修改暴力计算对这个位置的贡献,每一次询问暴力求以上式子,暴力初始化,达到操作用量 2(n+q)n2(n+q)\sqrt n。期望得分 5353 分。

    详细:假设修改修改了 aia_i 的值为 aixa_ix,则在 ii 处加上了 ai(x1)a_i(x-1)
    ii 在对应多项式里的系数为 i26\lfloor\frac{i}{2^6}\rfloor。则它对 399824435226j3^{\frac{998244352}{2^6}j} 处的值产生了 $3^{\frac{998244352}{2^6}j\lfloor\frac{i}{2^6}\rfloor}$ 的贡献。

    算法 5

    在算法 4 基础上初始化用 NTT,操作用量 4nlogn+2qn4n\log n+2q\sqrt n,期望得分 100100 分。

    信息

    ID
    166
    时间
    2000ms
    内存
    512MiB
    难度
    10
    标签
    (无)
    递交数
    16
    已通过
    1
    上传者