考虑到:
(f(x)equiv f(a)(mod(x- a)))
这样我们就可以列出关于(f(x))的多项式线性同余方程组。
(
left{
egin{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}
ight.
)
我们根据中国剩余定理,有:
(M = prod_{i = 1}^n (x-x_i),m_i = frac{M}{x - x_i} = prod_{j
eq i}(x_i - x_j))
则(m_i)膜((x - x_i))的逆元为:
(m_i^{-1} = prod_{j
eq 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
eq 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;
}