题目情境#
题目链接:https://www.luogu.com.cn/problem/P4781 ↗
题目描述
对于 个点 ,如果满足 ,那么经过这 个点可以唯一地确定一个 次多项式 。
现在,给定这样 个点,请你确定这个 次多项式,并求出 的值。
输入格式
第一行两个整数 。
接下来 行,第 行两个整数 。
输出格式
一行一个整数,表示 的值。
输入 #1
3 100
1 4
2 9
3 16plaintext输出 #1
10201plaintext输入 #2
3 100
1 1
2 2
3 3plaintext输出 #2
100plaintext,, 两两不同。
算法解析:#
时间复杂度:
拉格朗日插值:。对每个 ,分子累乘 、分母累乘 ,分母用逆元(费马小定理)处理模意义除法。
C++代码实现#
// 拉格朗日插值法 O(n^2)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
const LL mod=998244353;
LL n,k,ans;
LL x[2005],y[2005];
LL ksm(LL a,LL b){
LL s=1;
while(b){
if(b&1)s=s*a%mod;
a=a*a%mod;
b>>=1;
}
return s;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>x[i]>>y[i];
for(int i=1;i<=n;i++){
LL a=y[i],b=1;
for(int j=1;j<=n;j++){
if(i==j) continue;
a=a*(k-x[j])%mod;
b=b*(x[i]-x[j])%mod;
}
ans=(ans+a*ksm(b,mod-2)%mod)%mod;
}
cout<<(ans+mod)%mod;
}c