• 模板


    已知 (n+1) 个点,拟合一个多项式 (f) ,求 (f(x)) 的值。

    拉格朗日插值多项式为: (f(x)=sumlimits_{i=0}^{n}y_ifrac{prod_{j=0,j eq i}^{n}(x-x_j)}{prod_{j=0,j eq i}^{n}(x_i-x_j)})

    从数组 (x)(y)([0,n])(n+1) 个点,插值出一个 (n) 次多项式 (f) ,然后求出 (f(x_i)) 返回。

    int lagrange(int n, int *x, int *y, int xi) {
        int ans = 0;
        for (int i = 0; i <= n; i++) {
            int s1 = 1, s2 = 1;
            for (int j = 0; j <= n; j++)
                if (i != j) {
                    s1 = 1ll * s1 * (xi - x[j]) % mod;
                    s2 = 1ll * s2 * (x[i] - x[j]) % mod;
                }
            ans = (1ll * ans + 1ll * y[i] * s1 % mod * quick_pow(s2, mod - 2) % mod) % mod;
        }
        return (ans + mod) % mod;
    }
    

    从数组 (x)(y)([0,n])(n+1) 个点,插值出一个 (n) 次多项式 (f) ,然后求出 (f(x_i)) 返回,其中数组 (x) 的点需要是连续自然数。

    int lagrange(int n, int *x, int *y, int xi) {
        int ans = 0;
        s1[0] = (xi - x[0]) % mod, s2[n + 1] = 1;
        for (int i = 1; i <= n; i++)
            s1[i] = 1ll * s1[i - 1] * (xi - x[i]) % mod;
        for (int i = n; i >= 0; i--)
            s2[i] = 1ll * s2[i + 1] * (xi - x[i]) % mod;
        ifac[0] = ifac[1] = 1;
        for (int i = 2; i <= n; i++)
            ifac[i] = -1ll * mod / i * ifac[mod % i] % mod;
        for (int i = 2; i <= n; i++)
            ifac[i] = 1ll * ifac[i] * ifac[i - 1] % mod;
        for (int i = 0; i <= n; i++)
            (ans += 1ll * y[i] * (i == 0 ? 1 : s1[i - 1]) % mod * s2[i + 1] % mod
                    * ifac[i] % mod * (((n - i) & 1) ? -1 : 1) * ifac[n - i] % mod) %= mod;
        return (ans + mod) % mod;
    }
    
  • 相关阅读:
    常用品牌交换机镜像抓包配置
    BGP知识点备忘录
    IS-IS路由协议地址详解
    Linux msmtp+mutt发邮件
    Linux添加一临时用户拥有root权限最快方式
    ELK5.0全程普通用户源码安装指南(CentOS6.5)
    改变文件的拥有者和改变文件的拥有组
    Linux chmod命令详解
    Linux目录介绍
    php时间戳转化成时间相差8小时问题
  • 原文地址:https://www.cnblogs.com/KisekiPurin2019/p/12525478.html
Copyright © 2020-2023  润新知