拉格朗日插值。

考虑到:
\(f(x)\equiv\ f(a)(mod(x- a))\)
这样我们就可以列出关于\(f(x)\)的多项式线性同余方程组。
\( \left\{ \begin{aligned} &f(x)\equiv\ y_1(mod(x- x_1))\\ &f(x)\equiv\ y_2(mod(x- x_2))\\ &....\\ &f(x)\equiv\ y_n(mod(x- x_n)) \end{aligned} \right. \)

我们根据中国剩余定理,有:
\(M = \prod_{i = 1}^n (x-x_i),m_i = \frac{M}{x - x_i} = \prod_{j \neq i}(x - x_j)\)
\(m_i\)\((x - x_i)\)的逆元为:
\(m_i^{-1} = \prod_{j \neq i}\frac{1}{x_i - x_j}\)
所以有:
\(f(x) \equiv \sum_{i = 1}^n y_i m_i m_i^{-1} \equiv \sum_{i = 1} ^ n y_i \prod_{j \neq i} \frac{x - x_j}{x_i - x_j} (mod M)\)

所以在膜意义下,\(f(x)\)是唯一的。

这样可以在\(O(n^2)\)时间内求出多项式。

#include<iostream>
#include<cstdio>
#define ll long long 
#define N 2020
#define mod 998244353

ll n,k,x[N],y[N],ans,s1,s2;

inline ll pow(ll a,ll b){
	ll ans = 1;
	while(b){
		if(b & 1)ans = ans * a % mod;
		a = a * a % mod;
		b >>= 1;
	}
	return ans;
}

int main(){
	scanf("%lld%lld",&n,&k);
	for(int i = 1;i <= n;++i)
	scanf("%lld%lld",&x[i],&y[i]);
	for(int i = 1;i <= n;++i){
		s1 = y[i] % mod;
		s2 = 1ll;
		for(int j = 1;j <= n;++j)
		if(i != j)s1 = (s1 * (k - x[j] + mod) % mod) % mod,s2 = (s2 * (x[i] - x[j] + mod) % mod) % mod;
		ans = (ans + s1 * pow(s2,mod - 2) % mod + mod) % mod;
	}
	std::cout<<((ans + mod) % mod)<<std::endl;
}
posted @ 2021-08-18 22:05  fhq_treap  阅读(72)  评论(0编辑  收藏  举报