首页 > 其他分享 >多项式插值

多项式插值

时间:2023-01-16 21:33:33浏览次数:34  
标签:tmp 插值 多项式 int ans mod

一个 \(n-1\) 次多项式,可以用 \(n\) 个点 \((x_i,y_i)\) 表示。
知道了某个多项式上 \(n\) 个点的点值,可以用拉格朗日插值公式还原出多项式,或者求给定 \(x\) 的函数值。朴素做法时间复杂度 \(O(n^2)\)。可以运用分治+NTT优化到 \(O(n \log n)\)。如果给定要求的点是一个点,并且你可以选择一段有特殊性质的点值(例如 \(x_i = i\)),可以用预处理的方法做到线性快速插值。

基本柿子

\[f(x) = \sum \limits_{i} \cfrac{\prod \limits_{j \neq i} (x-x_j)}{\prod \limits_{j \neq i} (x_i-x_j)} \times y_i \]

根据“第 \(i\) 项点的值为 \(y_i\),其他为 \(0\)”构造。注意下方为 \(\prod(x_i - x_j)\),推的时候不要犯迷糊。

显然是一个 \(n-1\) 次多项式。
注意负数。

P4781

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define f(i, a, b) for(int i = (a); i <= (b); i++)
#define cl(i, n) i.clear(),i.resize(n);
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int inf = 1e9;
//#define cerr if(false)cerr
#define watch(x) cerr  << (#x) << ' '<<'i'<<'s'<<' ' << x << endl
void cmax(int &x, int y) {if(x < y) x = y;}
void cmin(int &x, int y) {if(x > y) x = y;}
const int mod=998244353;
int qpow(int n,int k){
    int ans=1;
    while(k){
        if(k&1)ans=ans*n%mod;
        n=n*n%mod;
        k>>=1;
    }
    return ans;
}
int x[100010],y[100010];
//调不出来给我对拍!
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    //time_t start = clock();
    //think twice,code once.
    //think once,debug forever.
    int n,k;cin>>n>>k;
    f(i,1,n)cin>>x[i]>>y[i];
    int ans=0;
    f(i,1,n){
        int tmp=1;
        f(j,1,n){
            if(j==i)continue;
            tmp=tmp*(k-x[j])%mod+mod;tmp%=mod;
            tmp=tmp*qpow(x[i]-x[j],mod-2)%mod+mod;tmp%=mod;
        }
        tmp=tmp*y[i]%mod;
        ans=ans+tmp;
        ans%=mod;
    }
    cout<<ans<<endl;
    //time_t finish = clock();
    //cout << "time used:" << (finish-start) * 1.0 / CLOCKS_PER_SEC <<"s"<< endl;
    return 0;
}

快速求点值

如果是单点求值,并且自由选点,那么选择 \(x_i = i\),原式可以预处理前缀后缀相关柿子做到每一项 \(O(1)\) 计算。
image

例题

【题意】

\[\sum \limits_{i=1}^n i^k \]

其中 \(n \le 10^9, k \le 10^6\)


【分析】
首先有个观察得到的性质,\(k\) 次方和是 \(k+1\) 次多项式。

然后前 \(k+1\) 项可以递推得到。

于是插值可以做。

标签:tmp,插值,多项式,int,ans,mod
From: https://www.cnblogs.com/Zeardoe/p/17056342.html

相关文章

  • 拉格朗日插值法
    概述拉格朗日插值法(下简称拉插)是一种多项式单点求值的算法。对于任意的\(K\)次多项式,我们可以利用其已知的\(K+1\)个或更多的点唯一确定该多项式的形式,且拥有比......
  • 特征多项式
    特征多项式。暂时不知道有什么用处。特征多项式矩阵\[A=\left(\begin{matrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&......
  • 多项式半家桶,但是未封装
    多项式乘法逆题意:给定\(n-1\)次多项式\(F(x)\),求多项式\(G(x)\),使得\(F(x)G(x)\equiv1\pmod{x^n}\)思路:设:\[F(x)g(x)\equiv1\pmod{x^m}\\\\\F......
  • ACM&OI 多项式算法专题
    ACM&OI基础数学算法专题一、FFT基础拉格朗日插值复数的运算性质和几何性质单位根和单位根反演快速傅里叶变换(FFT)的分治实现快速傅里叶逆变换(IFFT)快速傅里叶变换的......
  • 学习笔记:多项式半家桶
    已经吃撑了多项式求逆对于多项式\(A(x)\),求多项式\(B(x)\),满足\(A(x)*B(x)\equiv1\pmod{x^n}\)。递归求解。求模\(x^n\)的逆元时,假设先求出了模\(x^{\l......
  • 多项式乘法(FTT、NTT),但主要是习题
    诈尸。摆了一个多月没写boke的BE是屑。基础知识/模板因为太屑了所以就直接放巨佬们的博客力。快速傅立叶变换[学习笔记&教程]信号,集合,多项式,以及各种......
  • 学习笔记:多项式变换
    多项式学习笔记卷积形式:一般卷积形式\[F_i=\sum_{j\circk=i}a_jb_k\]当\(\circ\)为\(+\)是为常见的多项式加法卷积,\(\times\)有时也能转为加法,位运算是FWT,整除是狄......
  • 重学多项式
    重学多项式目录重学多项式更好的阅读体验戳此进入写在前面关于这篇Blog单位根定义复数意义下的的求法性质等比数列求和公式FFT本质目的离散傅里叶变换快速傅里叶变换优化C......
  • C++实现链式表示多项式加法运算
    #include<iostream>#include<cstdlib>usingnamespacestd;#defineMAXSIZE100#defineOK1#defineERROR0typedefintElemtype;typedefintStatus;typedefstructPNo......
  • 多项式基础
    选择了前路难以预测的方向孤注一掷仅凭一丝倔强就算是下一秒跌入深渊万丈仍还在注视微弱的光芒开新坑不知道是对是错,可能我还不够资格。但是我会拼尽全力把这个不完......