众所周知由个点(第个点为)可以确定一个次多项式在时的值,对取模。
那么这个式子是啥呢?
答案就是拉格朗日插值,具体公式如下:
那么怎么求这个式子呢?
观察主体是暴力,。
接下来注意到里有一个,原因是如果,那么,分母就变成了。
的话,显然下面的式子要求模的逆元,再乘上,该部分时间复杂度,总时间复杂度。
代码:
#include<bits/stdc++.h>
#define ns "-1"
#define fs(i,x,y,z) for(ll i=x;i<=y;i+=z)
#define ft(i,x,y,z) for(ll i=x;i>=y;i+=z)
#define ll long long
#define ull unsigned long long
//#define moda 998244353
#define ms(a,b) memset(a,b,sizeof(a))
#define sz(a) sizeof(a)
using namespace std;
const ll N=100001,inf=0x3f3f3f3f,moda=998244353;
inline ll read(){
ll date=0,w=1;char c=0;
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
return date*w;
}
ll ksm(ll a,ll b){
ll ans=1ll,base=a;
while(b){
if(b&1){
ans*=base;ans%=moda;
}
base*=base;base%=moda;
b>>=1;
}
return ans;
}
ll n,m,a[N],b[N],k,ans;
int main(){
m=read(),n=m-1;k=read();
fs(i,1,m,1){
a[i]=read(),b[i]=read();
}
fs(i,1,m,1){
ll joga=b[i]%moda,kaya=1ll;
fs(j,1,m,1){
if(j!=i){
joga=joga*(k-a[j])%moda;
kaya=kaya*((a[i]-a[j]%moda)%moda)%moda;
//joga%=moda;
}
}
ans+=joga*ksm(kaya,moda-2)%moda;ans=(ans+moda)%moda;
}
printf("%lld",ans);
return 0;
}