zoukankan      html  css  js  c++  java
  • 多项式

    拉格朗日插值

    • 拉格朗日插值法

      给你 (n) 个坐标 (P(x_i,y_i)),求经过这 (n) 个点的不超过 (n-1) 次的多项式 (f(x))(k) 处的点值。

      我们构造出 (n) 个多项式 (g_i(x))

      [g_i(x)=y_i imesprodlimits_{j eq i} frac{x-x_j}{x_i-x_j} ]

      仔细观察可以发现,(g_i(x)) 这个多项式在 (x_i) 处点值为 (y_i) ,在 (x_j(j!=i)) 处的点值全部为 (0)。这也正是我们构造它的用意。我们令:

      [egin{aligned} f(x)&=sumlimits_{i=1}^n g_i(x)\ &=sumlimits_{i=1}^n y_i imes prodlimits_{j eq i} frac{x-x_j}{x_i-x_j} end{aligned} ]

      根据 (g_i(x)) 的定义可以发现,(f(x)) 正是我们要求的多项式。直接把 (k) 往多项式里带就好了,记得预先线性求逆元。时间复杂度:(O(n^2))

      • (x_i) 连续时的做法

        把上面的式子带进去:

        [f(k)=sumlimits_{i=1}^{n}y_i imes prodlimits_{j eq i}frac{k-j}{i-j} ]

        我们记:

        [pre_i=prodlimits_{j=1}^{i}k-j\ suf_i=prodlimits_{j=i}^{n}k-j\ ]

        那么原式就变成了这样:

        [f(k)=sumlimits_{i=1}^n y_i frac{pre_{i-1} imes suf_{i+1}}{(i-1)! imes(n-j)! imes(-1)^{n-j&1}} ]

        这样我们就把复杂度优化到了 (O(n))

      • 重心拉格朗日插值法

        [l(k)=prodlimits_{i=1}^n k-x_i ]

        那么

        [egin{aligned} f(k)&=sumlimits_{i=1}^{n}y_i imes prodlimits_{j eq i}frac{k-x_j}{x_i-x_j}\ &=l(k) imessumlimits_{i=1}^n frac{y_i}{prodlimits_{j eq i}(k-x_i) imes (x_i-x_j)} end{aligned} ]

        然后记

        [w_i=frac{y_i}{prodlimits_{j eq i} (x_i-x_j)} ]

        最后原式为:

        [f(k)=l(k) imes sumlimits_{i=1}^n frac{w_i}{k-x_i} ]

    • 应用

      求自然数幂和:(S_k(n)=sumlimits_{i=1}^n i^k)(nleq 10^{12} ,kleq 10^7)

      由于数据范围过大,普通的方法已经不适用,我们试着列一个式子:

      [egin{aligned} S_k(n)&=sumlimits_{i=1}^{n}i^k\ &=sumlimits_{i=1}^n (i+1)^k-(n+1)^k+1\ &=sumlimits_{i=1}^n sumlimits_{j=0}^kinom k j imes i^j-(n+1)^k+1\ &=sumlimits_{i=1}^n (i^k+sumlimits_{j=0}^{k-1}inom k j imes i^j)-(n+1)^k+1\ &=S_k(n)+sumlimits_{i=1}^n sumlimits_{j=0}^{k-1}inom k j imes i^j-(n+1)^k+1 end{aligned} ]

      经过一波神奇的操作,我们发现 (S_k(n)) 被消掉了!这看似是一个很不好的消息,但是通过剩下来的式子我们惊喜的发现可以推出 (S_{k-1}(n)) 的表达式:

      [egin{aligned} S_{k-1}(n)&=frac{-sumlimits_{i=1}^n sumlimits_{j=0}^{k-2}inom k j imes i^j +(n+1)^k -1}{k}\ &=frac{-sumlimits_{j=0}^{k-2}inom k j imes S_j(n)+(n+1)^k-1}{k} end{aligned} ]

      用归纳法可以很轻松的知道 (S_{k-1}(n)) 是个 (k) 次多项式。同理 (S_k(n)) 是个 (k+1) 次多项式。那么我们求 (S_k(n)) 的时候,就可以线性筛预处理出 (S_k(1),S_k(2),cdots,S_k(k+2)) 的值,然后拉格朗日插值就可以做到 (O(k)) 的时间内求出自然数幂和了。

    • 例题:

      1. luogu P4781 【模板】拉格朗日插值 题解
      2. luogu P4593 [TJOI2018]教科书般的亵渎 题解
      3. BZOJ #3453. tyvj 1858 XLkxc 题解
      4. LOJ #165. 拉格朗日插值 题解
      5. luogu P3270 [JLOI2016]成绩比较 题解
      6. luogu P4463 [集训队互测2012] calc 题解

    快速沃尔什变换(FWT)

    这篇文章里有非常详细的具体推式子过程。

    • 同或运算

      补充一下同或运算的式子(来自OI Wiki):

      [A_i=sumlimits_{C_1}A_j-sumlimits_{C_2}A_j ]

      (C_1) 表示 (i|j) 奇偶性为 (0)(C_2) 表示 (i|j) 的奇偶性为 (1)

      [FWT[A]=merge(FWT[A_1]-FWT[A_0],FWT[A_1]+FWT[A_0])\ IFWT[A']=merge(frac{FWT[A_1']-FWT[A_0']}{2},frac{FWT[A_1']+FWT[A_0']}{2}) ]

    • 例题:

      1. luogu P4717 【模板】快速沃尔什变换 (FWT) 题解

    快速傅里叶变换(FFT)

    1. luogu P4721 【模板】分治 FFT 题解
  • 相关阅读:
    转一篇:arp欺骗的原理和防御
    CF1209A Paint the Numbers
    字符串专题之KMP算法
    CF1209B Koala and Lights
    CF1217A Creating a Character
    CF1217B Zmei Gorynich
    各种模板
    开通博客园拉..
    汇编语言程序设计学习笔记(第一遍学习)第4节:汇编就像HTML一样简单
    我也要学C语言第二十章:结构体类型变量,结构体数组
  • 原文地址:https://www.cnblogs.com/With-penguin/p/12839028.html
Copyright © 2011-2022 走看看