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

    拉格朗日插值负责搞这样一个问题:

    有一个给了 n 个特定点值的 n - 1 次函数(并不给表达式),然后我随机给一个数,求其值。

    如,给定 (1, 2), (4, 12), (123, 432) 的二次函数,求在函数上的点 (34433223, y) 的 (y) 的值。

    方法

    如果我们能构造一个函数,符合所有给定点都在函数图像上,那么该函数即为所求函数。

    考虑类似中国剩余定理的方法:当我们带入其中一个点 (x_i) 的时候,要求 (y_i) 为给定值,那么我们考虑把对于每一个点的式子加一块,如果式子恰好是关于点 (i) 的,那么就让其值为给定的那个 (y_i);否则让其为 (0)

    对于加粗部分如何实现?和CRT一样,我们构造一种连乘式,其中(i) 个连乘式恰好不包含 (x_i) 对于第 (i) 个式子,我们让连乘式中所有的式子都为1;对于其它的式子,我们让连乘式中的某一项为0.

    重点!!!

    [Huge f(x) = sum_{i=1}^{n}y_i*prod_{1<=j<=n,j ot=i}frac{x-x_j}{x_i-x_j} ]

    背过!!

    假设我们给了个 (x_i),那么当第一层循环不为 (i) 的时候,一定存在一个 (j),使得 (x) 自己减自己,这样连乘式中一项为0,故有 (prod _ {j ot= i} x-x_j);第一层循环到 (i) 的时候,要求那个连乘式一定为1,因此除一下 (x_i - x_j) 即可,即 (prod frac{x-x_j}{x_i-x_j})

    构造好式子以后,我们代入其它的 (x) 得到的 (y) 也就一定符合这个函数了。

    单次复杂度:(O(n^2))

    背过!!

    [Huge f(x) = sum_{i=1}^{n}y_i*prod_{1<=j<=n,j ot=i}frac{x-x_j}{x_i-x_j} ]

    例题

    P4781 【模板】拉格朗日插值

    my record

    T130226 一起学习的日子(study)

    题意:

    求:

    [sum_{i=0}^{n}sum_{j=1}^{a+i* d}sum_{l=1}^j{l^k} mod ~ 123 45 67 891 ]

    其中 (k <= 3000,n,a,d<=1e9)

    题解:

    我们知道:

    1 + 1 + 1 + ... + 1 可以表示为一次多项式(n),

    1 + 2 + 3 + ... + n 的值可以表示为二次多项式((n * (n + 1) / 2));

    (1^2 + 2^2 + 3^2 + ... + n^2) 可以表示为三次多项式(n * (n + 1) * (2 * n + 1) / 6))。

    那么我们猜测 (1^k + 2^k + ... + n^k) 可以表示为 (n + 1) 次多项式

    我们进而猜测:

    (sum_{l=1}^j{l^k})(k + 1) 次多项式;----①

    (sum_{j=1}^{i}sum_{l=1}^j{l^k})(k + 2) 次多项式;------②

    (sum_{i=0}^{n}sum_{j=1}^{a+i* d}sum_{l=1}^j{l^k})(k + 3) 次多项式。-----③

    我们还发现,①②的计算方法不是很复杂,也就是说,算出②的拉格朗日插值的表达式所需的(k+...)((x_i, y_i)) 其实可以直接暴力前缀和算出。而③不行。因此我们对于③,使用拉格朗日插值依次算出其前 (k + 4) 个值,然后再用拉格朗日插值算出第 (n) 项的值。

    复杂度: (O(k^3))

    优化:因为 (x_i = i),我们发现那个连乘式的分子和分母对于不同的 (i) 有大量重复,分母本质上是两个阶乘(分正负数讨论),分子可以直接预处理出前缀积和后缀积。然后拉格朗日插值优化为单次 (O(n))

    my record

    CF622F The Sum of the k-th Powers

    经典问题:O(klogP)求 (sum_{i=1}^{n}i^k)。方法和优化同上。

    my record

    P4593 [TJOI2018]教科书般的亵渎

    转化后转变成求 (sum_{i=1}^{n}i^k) 的问题。

    my record

    注意:

    一定记得对负数进行 +P!!!

  • 相关阅读:
    太赞了!两个技巧帮你记住复杂 Linux 命令!
    Spring Cloud 学习 之 Spring Cloud Eureka(源码分析)
    Spring Cloud 学习 之 Spring Cloud Eureka(架构)
    Spring Cloud 学习 之 Spring Cloud Eureka(搭建)
    Spring Cloud 学习 之 Spring Cloud Eureka(概述)
    Spring Boot学习 之 Spring Boot Actuator(一)
    java基础篇 之 final关键字
    spring学习笔记(九)事务学习(上)
    JAVA基础篇 之 类的初始化
    JAVA基础篇 之 finalize()方法的作用
  • 原文地址:https://www.cnblogs.com/JiaZP/p/13550193.html
Copyright © 2011-2022 走看看