zoukankan      html  css  js  c++  java
  • 拉格朗日插值

    吓得我都被拉格朗日了

    小学知识可知,(n)个点((x_i,y_i))可以唯一地确定一个多项式

    现在,给定(n)个点,请你确定这个多项式,并将(k)代入求值

    求出的值对(998244353)取模

    我们首先可以想到高斯消元

    发现高斯消元是(O(n^3))的,我凉了

    看一眼标题,查一波公式发现了拉格朗日它老人家留下的好东西:

    拉格朗日插值法

    假设多项式为(f(k)),有点值((x_i,y_i)),那么多项式在(k)点的取值为

    [f(k)=sumlimits_{i=0}^{n}y_iprodlimits_{i e j}frac{k-x_j}{x_i-x_j} ]

    这个式子是怎么推出来的呢?

    这个您得问拉格朗日去 但是我们可以证明一下

    (1.)分母不为(0):
    当分母为(0)时当且仅当存在(x_i=x_j),那么如果(y_i=y_j)就是同一点,可以去重,如果(y_i e y_j),不满足函数性质
    (2.)满足所有给定点值:
    对于(k=x_i),当(sum)中的(x_i e k)时,其他项均存在(k-x_i=0),对于(x_i=k)时,满足(prod)中所有项均为(1),则最终答案为(y_i)

    所以说它好像是对的,复杂度(O(n^2))

    前缀积后缀积优化

    (x_i)取值连续时,我们可以用前缀积后缀积优化到(O(n))

    在连续时,我们把(x_i)替换为(i)得到

    [f(k)=sumlimits_{i=0}^{n}y_iprodlimits_{i e j}frac{k-j}{i-j} ]

    如果我们有(pre_i=prodlimits_{j=0}^{i}k-j)以及(suf_i=prodlimits_{j=i}^{n}k-j,fac_i=prodlimits_{j=1}^{i}j)

    那么原式可以表示为

    [f(k)=sumlimits_{i=0}^{n}y_ifrac{pre_{i-1}*suf_{i+1}}{fac_{i}*fac_{n-i}}*(-1)^{n-i} ]

    重心拉格朗日插值

    回到最初的起点:

    [f(k)=sumlimits_{i=0}^{n}y_iprodlimits_{i e j}frac{k-x_j}{x_i-x_j} ]

    这个式子是不通用的,每改变一个点值就要(O(n^2))地重新计算

    我们做一个变形,设(g=prodlimits_{i=0}^{n}k-x_i)

    [f(k)=gsumlimits_{i=0}^{n}frac{y_i}{k-x_i}prodlimits_{i e j}frac{1}{x_i-x_j} ]

    (t_i=frac{y_i}{prodlimits_{i e j}x_i-x_j})

    [f(k)=gsumlimits_{i=0}^{n}frac{t_i}{k-x_i} ]

    每次修改或插入直接修改(t_i)就好了,注意重心插值不能处理(k=x_i)

    例题

    洛谷P4593 [TJOI2018]教科书般的亵渎

  • 相关阅读:
    Android Studio 常用快捷键以及设置
    GitHub windows客户端拉代码和提交代码
    Android Studio + gradle多渠道打包
    Android sdk 镜像服务器资源
    Rikka with Graph(联通图取边,暴力)
    Rikka with Chess(规律)
    Largest Submatrix(动态规划)
    City Game(动态规划)
    Largest Rectangle in a Histogram(最大矩形面积,动态规划思想)
    How many ways(记忆化搜索)
  • 原文地址:https://www.cnblogs.com/knife-rose/p/12029276.html
Copyright © 2011-2022 走看看