题目链接:https://loj.ac/problem/165
拉格朗日插值重心优化
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
const int maxn = 3010;
int num, x[maxn], y[maxn], w[maxn];
int q_pow(int a, int b){
int ans = 1;
while(b > 0){
if(b & 1){
ans = ans * a % mod;
}
a = a * a % mod;
b >>= 1;
}
return ans;
}
inline int inv(int x){
return q_pow(x, mod-2);
}
inline void ins(int x0, int y0)
{
num++;
x[num] = x0;
y[num] = y0;
w[num] = 1;
for(int i = 1; i <= num-1; i++)
{
w[i] = w[i]*(x[i]-x0)%mod;
w[num] = w[num]*(x0-x[i])%mod;
}
}
inline int f(int x0)
{
int g = 1, ans = 0;
for(int i = 1; i <= num; i++)
{
if(x[i] == x0) return y[i];
g = g*(x0-x[i])%mod;
}
for(int i = 1; i <= num; i++)
ans = (ans + y[i]*inv((x0-x[i])*w[i]))%mod;
return (g*ans%mod+mod)%mod;
}
signed main()
{
int n, opt;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> opt;
if(opt == 1)
{
int x, y;
cin >> x >>y;
ins(x, y);
}
else
{
int k;
cin >> k;
cout << f(k) << endl;
}
}
return 0;
}
京公网安备 11010502036488号