多項式多點求值

2022-09-11 02:09:13 字數 1767 閱讀 2424

給出乙個 \(n\) 次多項式 \(f(x)\) ,對於 \(i \in [1,m]\) ,求 \(f(a_i)\) .

答案對 \(998244353\) 取模

\(n,m \in [1,64000]\) , \(a_i,[x^i]f(x)\in [0,998244353)\)

考慮遞迴求解,令 \(mid=\lfloor \dfrac m2 \rfloor\)

\[p_0(x) = \prod_^ (x-a_i) \\

p_1(x) = \prod_^ (x-a_i)

\]對於 \(i \in [1,mid]\) ,有 \(p_0(a_i) = 0\) .那麼我們對於 \(f(x)\) 進行多項式除法,得到

\[f(x)=d(x)p_0(x)+r(x)

\]那麼有 \(r(a_i)=f(a_i)\) ,且 \(r(x)\) 的次數為 \(mid-1\) .

對右邊的部分也類似的處理,就可以在 \(o(n \log n)\) 的時間將它們變為兩個更小的子問題.這一部分的時間複雜度為 \(o(n \log^2 n)\) .

\(p_0(x),p_1(x)\) 都可以用分治fft算出,時間複雜度為 \(o(n \log^2 n)\) .

所以總時間複雜度 \(o(n \log^2 n)\) .

#include #include #include #include #define debug(...) fprintf(stderr,__va_args__)

#define inver(a) power(a,mod-2)

#define lson u<<1,l,mid

#define rson u<<1|1,mid+1,r

using namespace std;

typedef long long ll;

const int mod=998244353;

const int maxn=64000+50;

const int maxnode=maxn<<2;

int n,m;

int a[maxn];

vectorf;

vectorp[maxnode];

inline int add(int x)

inline int sub(int x)

ll power(ll x,ll y)

return re;

}void print(vector&v)

for(int i=1,s=0;i&a,vector&b,vector&c,int degc)

int mid=(n+1)>>1;

inverse(a,mid,b);

copy(a.begin(),a.begin()+n,a);

copy(b.begin(),b.end(),b),fill(b+mid,b+n,0);

int deg=1; while(deg<=(n<<1)) deg<<=1;

fill(a+n,a+deg,0);

fill(b+n,b+deg,0);

fft(a,deg,1),fft(b,deg,1);

for(int i=0;i&a,vector&b,vector&r)

void evaluation(int u,int l,int r,vector&f)

int mid=(l+r)>>1;

evaluation(lson,a);

evaluation(rson,a);

}void sol()

int main()

多項式多點求值

給定乙個多項式和m個x,求相應的y 我們把需要求值的點均分成兩個集合s1,s2,構造兩個多項式p1,p2,使得這兩個多項式分別為這兩個集合的零點。則多項式a p1對於s1滿足a p1對s1內元素求值和a相同,a p2對於s2內求值和a相同,而它們次數都是n 2,分治遞迴下去繼續求值即可。由於多項式取...

更快的多項式多點求值?

乙個奇妙的科技 定義卷積矩陣 m begin a 0 0 0 a 1 a 0 0 a 2 a 1 a 0 end 顯然,我們把多項式係數 a 0,a 1.拿下來放到這個方陣中,另乙個多項式寫成列向量的形式,用此矩陣乘向量即是對另乙個多項式模 x n 意義下的多項式乘法 冪和矩陣 a begin 1 ...

多項式求值

例2 8 多項式求值 考察多項式p x n cix i i 0 如果cn 0,則p 是乙個n 維多項式。下面程式可用來計算對於給定的值x,p x 的實際取值。假定根據f o r迴圈內部所執行的加和乘的次數來估算時間複雜性。可以使用維數n 作為例項特徵。進入f o r迴圈的總次數為n,每次迴圈執行1次...