给出n个点,其多项式函数
f
(
x
)
=
∑
i
=
1
n
(
∏
j
=
1
,
j
!
=
i
n
(
x
−
x
i
x
i
−
x
j
)
)
∗
y
i
f(x) = \sum_{i=1}^n(\prod_{j=1,j != i}^n(\frac {x - x_i}{x_i-x_j}))*y_i
f(x)=∑i=1n(∏j=1,j!=in(xi−xjx−xi))∗yi
/*
拉格朗日插值法,复杂度O(n^2)
可以给出一个恰好穿过二维平面上若干个已知点的多项式函数
*/
#include <cstdio>
#define mod 998244353
typedef long long ll;
ll x[2005],y[2005];
ll ni[2005];
ll ext_gcd(ll a,ll b,ll &t1,ll &t2) //负数跑扩欧会出问题
{
ll d = a;
if( b == 0 )
{
t1 = 1;
t2 = 0;
}else
{
d = ext_gcd(b,a%b,t2,t1);
t2 -= a / b * t1;
}
return d;
}
ll lagrange(int n,int k) //n个未知数,计算f(k)
{
ll ans = 0;
for (int i = 1; i <= n; i++)
{
ll s1 = 1,s2 = 1; //s1为分子,s2为分母
for (int j = 1; j <= n; j++)
{
if( i == j ) continue;
s1 = s1 * (k + mod - x[j]) % mod; //保证每一项都是正数
s2 = s2 * (x[i] + mod - x[j]) % mod;
}
ll t1,t2;
ext_gcd(s2,mod,t1,t2);
t1 = (t1 % mod + mod) % mod; //计算s2的逆元
s1 *= t1;
s1 %= mod;
s1 *= y[i];
s1 %= mod;
ans += s1;
ans %= mod;
}
return ans;
}
int main()
{
ll n,k;
scanf("%lld%lld",&n,&k);
for (int i = 1; i <= n; i++)
{
scanf("%lld%lld",&x[i],&y[i]);
}
printf("%lld",lagrange(n,k));
return 0;
}