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]教科书般的亵渎

  • 相关阅读:
    mybatis连接MySQL8.0出现的问题
    zqsb项目中发现没有getMSSVideoList
    idea快速实现接口的方法
    鸟枪换炮---IDEA
    IDEA的使用---常用的快捷键
    MQ消息队列
    token的主要用法?
    oracle中游标的使用
    乐观锁和悲观锁
    分布式系统的事务控制
  • 原文地址:https://www.cnblogs.com/knife-rose/p/12029276.html
Copyright © 2011-2022 走看看