1. 程式人生 > >[Notes][多項式]雜記 · 多項式演算法—多項式求逆 多項式取模 多項式開根…

[Notes][多項式]雜記 · 多項式演算法—多項式求逆 多項式取模 多項式開根…

多項式

由若干個單項式相加組成的代數式叫做多項式
形如:f(x)=i=0naixi
degf(x)稱為f的度,是f(x)最高次項的次數。

生成函式

形如i=0aixi
生成函式又稱母函式,往往和多項式演算法聯絡起來起到優化轉移的作用

多項式演算法

加減法

多項式加減法比較簡單
f(x)=i=0naixig(x)=i=0nbixi

(f±g)(x)=i=0n(ai±bi)xi

程式碼實現也比較簡單

乘法

多項式乘法是所有多項式演算法的基礎,也是生成函式的卷積運算

f(x)=i=0naixig(x)=i=0nbixi

(f×g)(x)=i=02nj=0iaj×bijxi

樸素的多項式乘法是O(n2)的,但FFT(快速傅立葉變換)運用複數根的特性可以在O(nlogn)的複雜度內實現多項式的係數表達和點值表達的轉化,運用點值表達實現O(n)的相乘,總複雜度就是O(nlogn),但是因為常數過大,往往小範圍會使用暴力。

inline void FFT(E *a,int r){
  for(int i=0;i<n;i++) if(rev[i]>i) swap(a[rev[i]],a[i]);
  for(int i=1;i<n;i<<=1){
    E wn(cos(M_PI/i),r*sin(M_PI/i));
    for(int j=0;j<n;j+=(i<<1)){
      E w(1,0);
      for(int k=0;k<i;k++,w=w*wn){
    E x=a[j+k],y=w*a[j+k+i];
    a[j+k]=x+y
; a[j+k+i]=x-y; } } } if(r==-1) for(int i=0;i<n;i++) a[i].real/=n; }

運用生成函式的計數問題往往會對一個質數取模,如果這個質數可以表示成k×2n+1,其中k為奇數n大於多項式的度數,那麼就可以用這個質數的原根代替複數根,實現多項式的係數對一個質數取模,這個演算法就是NTT(快速數論變換),這種模數稱為NTT模數。

inline void Pre(int n){
  num=n;
  int g=Pow(3,(P-1)/num);
  w[0][0]=w[1][0]=1; for(int i=1;i<num;i++) w[0][i]=1LL*w[0][i-1]*g%P;
  for(int i=1;i<num;i++) w[1][i]=w[0][num-i];
}

inline void NTT(int *a,int n,int r){
  for(int i=1;i<n;i++) if(rev[i]>i) swap(a[i],a[rev[i]]);
  for(int i=1;i<n;i<<=1)
    for(int j=0;j<n;j+=i<<1)
      for(int k=0;k<i;k++){
        int x=a[j+k],y=1LL*a[j+k+i]*w[r][num/(i<<1)*k]%P;
        a[j+k]=(x+y)%P; a[j+k+i]=(x+P-y)%P;
      }
  if(!r) for(int i=0,inv=Pow(n,P-2);i<n;i++) a[i]=1LL*a[i]*inv%P;
}

不過有些喪心病狂的題的模數不是NTT模數,這個時候需要CRT合併。

多項式求逆

最後會得到f(x)=f(x)g(x)+1,這是一個非齊次線性遞推,因為求的第n項不大,只要直接求出f(x)就行了

很容易可以得到f(x)=11g(x),如果令

相關推薦

[Notes][多項式]雜記 · 多項式演算法多項式 多項式 多項式

多項式 由若干個單項式相加組成的代數式叫做多項式 形如:f(x)=∑ni=0aixif(x)=∑i=0naixi, degf(x)deg⁡f(x)稱為ff的度,是f(x)f(x)最高次項的次數。 生成函式 形如∑∞i=0aixi∑i=0∞aixi

歸併排序演算法序對思路及Java實現

1.歸併排序演算法思路 首先我們要清楚,歸併排序演算法採用了分治法的思想,即將原問題分解為幾個規模較小但類似於原問題的子問題,遞迴地求解這些子問題,然後再合併這些子問題的解來建立原問題的解。歸併排序首先將排序分成兩部分,接著再將這兩部分分解成更小的兩部分,直到分解到只剩一個元素為止。

擴充套件歐幾里得演算法

師父的擴充套件歐幾里得演算法詳細部落格師父喲 大神的求逆元詳細部落格大神的呢 gcd(a,b)即求a和b的最大公約。用輾轉相除法求得。 擴充套件歐幾里得演算法是歐幾里得演算法(又叫輾轉相除法)的擴充套件。除了計算a、b兩個整數的最大公約數,此演算法還能找到

組合數(楊輝三角打表 & 元(擴充套件歐幾里得、費馬小定理、尤拉定理、線性求法) & Lucas)

    在acm競賽中,組合數取模的題目還是經常會見到的,所以這是有必要掌握的一個演算法。我本人就因為這個東西而被坑了很多次了= =之前的部落格也都扯過了,就不多說了,下面進入正題。 (1)楊輝三角求組合數     楊輝三角這個東西應該都不陌生,三角的兩邊始終為一,之後向

Lucas定理(組合數) 擴充套件Lucas定理(解決數非質情況)

在比賽時 , 如果遇到CmnCnm的n比較大 , 我們不能通過預處理階乘和逆元來計算 , 而題目又要求對答案取一個質數模的時候 , 我們可以用Lucas定理來簡化計算 Lucas 定理: 定義 : n,m是非負整數,p是素數時 , Lucas(

關於餘和的區別以及負數

一、先說一說求餘和取模的區別。   一般情況下,大家都把求餘和求模混為一談。其實不然,求餘和取模是有區別的。  a%b  簡單來說,求餘的結果應該與a的符號保持一致;   而取模的結果應該與b的符號保持一致。 求餘 取模 5%2 1 1 -5%2 1 -1 5%-2

BZOJ3456: 城市規劃 多項式

sca 如果 數據 fpm void its bzoj3456 limit set 3456: 城市規劃 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 798 Solved: 451[Submit][Status][Di

【BZOJ】4555: [Tjoi2016&Heoi2016]求和 排列組合+多項式 或 斯特林數+NTT

oid int lan ret 多項式 algo com 題意 orm 【題意】給定n,求Σi=0~nΣj=1~i s(i,j)*2^j*j!,n<=10^5。 【算法】生成函數+排列組合+多項式求逆 【題解】參考: [BZOJ4555][Tjoi2016&H

【bzoj3456】城市規劃 容斥原理+NTT+多項式

方案 所在 scanf 整理 輸入 eof 輸出 std define 題目描述 求出n個點的簡單(無重邊無自環)無向連通圖數目mod 1004535809(479 * 2 ^ 21 + 1). 輸入 僅一行一個整數n(<=130000) 輸出 僅一行一個整

多項式,除法,開方,任意數FFT

play 給定 得到 精度 markdown 分配 二次 splay 倒置 多項式求逆 給定\(A(x)\)求滿足\(A(x)*B(x)=1\)的\(B(x)\) 寫成 \[A(x)*B(x)=1(mod \ x^n)\] 我們會求\[A(x)*B(x)=1(mod \ x

bzoj 3456 城市規劃 多項式+分治FFT

desc esc swap 存在 line tor memcpy status geo 城市規劃 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1091 Solved: 629[Submit][Status][Dis

[BZOJ3456]城市規劃(生成函數+多項式+多項式ln)

n) 100% 存在 d+ ont inner tar 現在 一行 城市規劃 時間限制:40s 空間限制:256MB 題目描述 剛剛解決完電力網絡的問題, 阿貍又被領導的任務給難住了. 剛才說過, 阿貍的國家

【BZOJ3625】【codeforces438E】小朋友和二叉樹 生成函數+多項式+多項式

== reverse turn chang 一個 函數 span 化簡 amp 首先,我們構造一個函數$G(x)$,若存在$k∈C$,則$[x^k]G(x)=1$。 不妨設$F(x)$為最終答案的生成函數,則$[x^n]F(x)$即為權值為$n$的神犇二叉樹個數

【learning】 多項式元詳解+模板

n) 意義 詳解 需要 一個 求逆 ont time 前置 概述 多項式求逆元是一個非常重要的知識點,許多多項式操作都需要用到該算法,包括多項式取模,除法,開跟,求ln,求exp,快速冪。用快速傅裏葉變換和倍增法可以在$O(n log n)$的時間復雜度下求出一個$n$次

BZOJ 3456 城市規劃 ( NTT + 多項式 )

out mat BE def sizeof ted online connected mod 題目鏈接: https://www.lydsy.com/JudgeOnline/problem.php?id=3456 題意: 求出\(n\)個點的簡單(無重邊無自環)無向連通圖的

BZOJ 3456: 城市規劃 與 算法介紹(多項式元 , dp)

間接 zoj 3456 ini 不難 har 大小 #define form lock 題面 : 求有 \(n\) 個點的無向有標號連通圖個數 . \((1 \le n \le 1.3 * 10^5)\) 題解 : 首先考慮 dp ... 直接算可行的方案數 ,

多項式

逆元 In 求逆 多項式 rac span clas inline times 多項式求逆 求 \(A(x)\) 在 \(\%x^{n}\) 意義下的逆元 \(B(x)\) 首先求出 \(A(x)\) 在 \(\%x^{\lceil \frac{n}{2} \rceil}

[總結]多項式代替分治 $ ext{FFT}$

求逆 我們 for ora pac a* inline ali ace 由於我懶得不想學蠢得學不會分治 \(\text{FFT}\) ,發現可以用多項式求逆來完整地代替... 文章節選自分治 FFT 與多項式求逆,轉載方便自己查看。更多多項式求逆和分治 \(\text{FF

洛谷P4238 【模板】多項式(NTT)

tdi stdout style show include main -a 沒有 如果 傳送門 學習了一下大佬的->這裏 已知多項式$A(x)$,若存在$A(x)B(x)\equiv 1\pmod{x^n}$ 則稱$B(x)$為$A(x)$在模$x^n$下