洛谷傳送門
這是一道模板題
由小學知識可知, n
nn 個點 (xi
,yi)
(x_i,y_i)
(xi,y
i) 可以唯一地確定乙個多項式
現在,給定 n
nn 個點,請你確定這個多項式,並將 k
kk 代入求值
求出的值對 998244353
998244353
998244
353 取模
輸入格式:
第一行兩個正整數 n,k
n,kn,
k ,含義如題
接下來 n
nn 行,每行兩個正整數 xi,
yi
x_i,y_i
xi,yi
,含義如題
輸出格式:
乙個整數表示答案
輸入樣例#1:
3 100
1 42 9
3 16
輸出樣例#1:10201
輸入樣例#2:3 100
1 12 2
3 3
輸出樣例#2:100
n
≤2000xi
,yi,
k≤
998244353
n \leq 2000 \; \; \; x_i,y_i,k \leq 998244353
n≤2000
xi,
yi,
k≤99
8244
353;
樣例一中的三個點確定的多項式是 f(x
)=x2
+2x+
1f(x)=x^2+2x+1
f(x)=x
2+2x
+1,將 100
10010
0代入求值得到 10201
10201
10201
樣例二中的三個點確定的多項式是 f(x
)=
xf(x)=x
f(x)=x
,將 100
10010
0 代入求值得到 100
10010
0 如果你不會拉格朗日插值,你可以到這裡去學習一下
此外,請注意演算法的常數問題,建議開啟o2優化
拉格朗日插值法是什麼? 就是下面這個東西:
f (x
)=∑i
=1nf
(xi)
∏j=1
,j≠i
nx−x
jxi−
xj
f(x)=\sum_^f(x_i)\prod_^\frac
f(x)=i
=1∑n
f(x
i)j
=1,j
̸=i
∏nx
i−x
jx−
xj
那麼我們代入值進去計算即可。
複雜度o(n
2)
o(n^2)
o(n2
)(貌似有o(n
log2
n)
o(nlog^2n)
o(nlog
2n)的多項式多點插值演算法??蒟蒻不會…)
**如下:
#include
#include
#include
#include
#include
#include
#define w while
#define r register
#define in inline
#define mx 2005
#define ll long long
#define gc getchar()
#define mod 998244353ll
bool neg;
template
<
class
t>
in void
in(t &x)
w (isdigit
(c))
x =(x <<1)
+(x <<3)
+ c -
48, c = gc;
if(neg) neg =
false
, x =
-x;}
int num;
ll tar;
int x[mx]
, y[mx]
;ll qpow
(ll now, ll tim)
return ret;
}ll lagrange()
ret =
(ret + up *
qpow
(down, mod -2)
% mod * y[i]
% mod + mod)
% mod;
}return ret;
}int
main
(void
)
Luogu P4781 模板 拉格朗日插值
洛谷傳送門 板題 注意一下求多個數的乘積的逆元不要乙個個快速冪求逆元,那樣很慢,時間複雜度就是o n 2log o n 2log 直接先乘起來最後求一次逆元就行了.時間複雜度為o n log n2 o n2 o n log n2 o n2 這樣的拉格朗日插值是預處理o n 2 o n2 插入o n ...
luogu P4781 模板 拉格朗日插值
嘟嘟嘟 本來以為拉格朗日插值是乙個很複雜的東西,今天學了一下才知道就是乙個公式 我們都知道 n 個點 x i,y i 可以確定唯一乙個最高次為 n 1 的多項式,那麼現在我們已知這 n 個點,求這個多項式代入 k 時的值。首先都能想到用高斯消元 o n 3 求出多項式,然後代入 k 但是這樣有點慢,...
P4781 模板 拉格朗日插值
拉格朗日插值是一種能夠根據n個點 x i,y i 求出對應多項式的方法 定義拉格朗日插值的基函式 l i 為 l i prod n fracy i 容易發現這個函式的特點就是當 x x i 時,y y i 其他時候 y 0 所以最後插值出來的多項式就是這n個基函式求和 恰好在每個 x i 處取到 y...