1 条题解

  • 0
    @ 2025-12-10 15:07:41

    「多项式多点求值」题解

    题意简化

    给定 nn 次多项式:

    f(x)=i=0n1aixif(x) = \sum_{i=0}^{n-1} a_i x^i

    nn 个点:

    $$x_k = b \cdot c^{4k} + d \cdot c^{2k} + e, \quad k=0,1,\dots,n-1 $$

    要求计算 f(x0),f(x1),,f(xn1)f(x_0), f(x_1), \dots, f(x_{n-1}),模 M=106+3M = 10^6+3

    核心观察

    直接对每个 xkx_k 暴力计算 f(xk)f(x_k)O(n2)O(n^2)n60000n \leq 60000 不可行。

    关键点:

    1. xkx_k 有特殊形式:xk=b(c2k)2+dc2k+ex_k = b \cdot (c^{2k})^2 + d \cdot c^{2k} + e
    2. yk=c2ky_k = c^{2k},则 xk=byk2+dyk+ex_k = b y_k^2 + d y_k + e
    3. yky_k 构成等比数列:yk=(c2)ky_k = (c^2)^k

    优化思路

    方法:利用多项式复合和快速求值

    1. 定义新多项式: 令 y=c2ky = c^{2k},则 x=by2+dy+ex = b y^2 + d y + e 是一个二次函数。

    2. 多项式复合: 我们实际上需要计算:

      $$f(g(y)) \quad \text{其中} \quad g(y) = b y^2 + d y + e $$
    3. 快速多点求值: 已知 yk=(c2)ky_k = (c^2)^k 是等比数列,对于多项式 h(y)=f(g(y))h(y) = f(g(y)),我们需要计算:

      h(y0),h(y1),,h(yn1)h(y_0), h(y_1), \dots, h(y_{n-1})

      其中 yk=rky_k = r^kr=c2r = c^2

    4. 利用卷积: 如果 h(y)=i=02n2hiyih(y) = \sum_{i=0}^{2n-2} h_i y^i,那么:

      h(rk)=i=02n2hirkih(r^k) = \sum_{i=0}^{2n-2} h_i r^{ki}

      这可以看作两个序列的卷积:

      h(rk)=i=02n2hi(rk)ih(r^k) = \sum_{i=0}^{2n-2} h_i \cdot (r^k)^i
    5. Chirp Z-transform(CZT): 计算 h(r0),h(r1),,h(rn1)h(r^0), h(r^1), \dots, h(r^{n-1}) 正是CZT变换,可以用FFT在 O(nlogn)O(n\log n) 完成。

    算法步骤

    1. 计算 g(y)=by2+dy+eg(y) = b y^2 + d y + e
    2. 多项式复合:计算 h(y)=f(g(y))h(y) = f(g(y)),即把 f(x)f(x) 中的 xx 替换为 g(y)g(y)
      • 由于 g(y)g(y) 是二次,h(y)h(y) 的次数是 2(n1)2(n-1)
      • 可以用多项式复合的算法,或直接展开
    3. 多点求值:计算 h(r0),h(r1),,h(rn1)h(r^0), h(r^1), \dots, h(r^{n-1}),其中 r=c2r = c^2
      • 使用CZT变换,O(nlogn)O(n\log n)
    4. 输出结果

    复杂度

    • 多项式复合:O(nlogn)O(n\log n)
    • CZT变换:O(nlogn)O(n\log n)
    • 总复杂度:O(nlogn)O(n\log n),可过 n=60000n=60000

    注意事项

    • 模数 M=106+3M=10^6+3 是质数,可用NTT
    • 注意 ckc^k 的快速幂计算
    • 边界情况:b=0b=0g(y)g(y) 是一次函数,更简单
    • 1

    信息

    ID
    5987
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者