1. 程式人生 > >多項式求逆與多項式除法/取模

多項式求逆與多項式除法/取模

多項式求逆

Procedure

多項式求逆是多項式模組中的一個重要操作(“操作”這個詞看出如今多項式題是多麼的工業化,猶如毒瘤8操作LCT),在做生成函式/多項式除法、多項式取模/多項式多點求值等中均有應用

對於一個n次多項式 F ( x ) F(x)

,我們希望求出一個m-1次多項式 G ( x ) G(x) ,滿足 F ( x
) G ( x ) 1 ( m o
d
x m ) F(x)G(x)\equiv 1\pmod {x^m}

也就是說, G ( x ) G(x) F ( x ) F(x) 在模 x m x^m 意義下的逆(即 x m x^m 以後的項我們都不管了,前面的項乘起來只有常數項係數為1,其他係數都是0)

多項式求逆運用了倍增的思想
假設我們已經求出了 B ( x ) , B ( x ) F ( x ) 1 ( m o d x m 2 ) B(x),B(x)F(x)\equiv 1\pmod {x^{m\over 2}}
考慮如何求 G ( x ) G(x)

移項
B ( x ) F ( x ) 1 0 ( m o d x m 2 ) B(x)F(x)-1\equiv 0\pmod {x^{m\over 2}}
此時意味著 B ( x ) F ( x ) 1 B(x)F(x)-1 的0 ~ m/2-1次項的係數全都是0,那麼將同餘式兩邊平方,就變成0 ~ m-1次項的係數都為0
因此
( B ( x ) F ( x ) 1 ) 2 0 ( m o d x m ) \left(B(x)F(x)-1\right)^2\equiv 0 \pmod {x^m}
展開
F 2 ( x ) B 2 ( x ) 2 F ( x ) B ( x ) + 1 0 ( m o d x m ) F^2(x)B^2(x)-2F(x)B(x)+1\equiv 0\pmod {x^m}
提一個 F ( x ) F(x) 出來
F ( x ) ( F ( x ) B 2 ( x ) 2 B ( x ) ) 1 ( m o d x m ) F(x)\left(F(x)B^2(x)-2B(x)\right)\equiv -1\pmod {x^m}

此時容易看出 G ( x ) 2 B ( x ) F ( x ) B 2 ( x ) ( m o d x m ) G(x)\equiv 2B(x)-F(x)B^2(x) \pmod {x^m}
這樣就求出了 F ( x ) F(x) x m x^m 意義下的乘法逆元
我們從m=1開始做,此時直接求常數項的乘法逆元即可,
然後可以推出m=2,4,8,16…
這樣一直倍增下去,直到m>=我們所需要的次數,此時直接取前面我們需要的項,後面多出來的直接設為0即可(模掉了沒有影響)

注意,由於我們求 G ( x ) G(x) 是在模 x m x^m 意義下進行的,而不是 x m 2 x^{m\over 2} ,因此即使 B ( x ) B(x) 的次數為m/2-1,此時的 F ( x ) F(x) 的次數仍然要取m-1

分析時間複雜度
T ( n ) = T ( n / 2 ) + O ( n log n ) = O ( n log n ) T(n)=T(n/2)+O(n\log n)=O(n\log n) (常數相當大)

Code

void make(int l,LL *a,LL *b)//l為我們需要的次數,a為待求逆多項式,用b來儲存結果
{
	b[0]=ksm(a[0],mo-2);//求常數項逆元
	for(int m=1,t=2,num=4,cnt=2;m<l;m=t,t=num,num<<=1,cnt++)
	//由於乘法有平方操作,因此NTT的範圍需要開到2倍。
	//t為當前的模數次數,m=t/2
	{
		prp(num,cnt);//預處理單位根、反位等
		fo(i,0,m-1) c[i]=a[i],d[i]=b[i];
		fo(i,m,t-1) c[i]=a[i];
		fo(i,t,num-1) c[i]=0;
		NTT(c,0,num),NTT(b,0,num);
		fo(i,0,num-1) b[i]=b[i]*b[i]%mo*c[i]%mo;
		NTT(b,1,num);
		fo(i,0,t-1) b[i]=((LL)2*d[i]-b[i]+mo)%mo;
		fo(i,t,num-1) b[i]=0;
	}		
}

多項式除法(多項式取模)

Procedure

多項式除法/取模也是多項式模組中的一個重要操作,在做生成函式/多項式多點求值等中均有應用。。。
對於一個n次多項式 F ( x ) F(x) ,m次多項式 G ( x ) G(x) (n>=m),我們希望求出一個n-m次多項式 H ( x ) H(x) ,一個至多m-1次的多項式 R ( x ) R(x) ,滿足 F ( x ) = G ( x ) H ( x ) + R ( x ) F(x)=G(x)H(x)+R(x) ,並且 R ( x ) R(x) 小於 G ( x ) G(x)

R ( x ) 0 ( m o d x n m + 1 ) R(x)\equiv 0\pmod {x^{n-m+1}}

相關推薦

多項式多項式除法/

多項式求逆 Procedure 多項式求逆是多項式模組中的一個重要操作(“操作”這個詞看出如今多項式題是多麼的工業化,猶如毒瘤8操作LCT),在做生成函式/多項式除法、多項式取模/多項式多點求值等中均有應用 對於一個n次多項式

擴充套件歐幾里德元+通用除法

#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f const int maxn=1e5+9; int e_gcd(int a,int b,int &x,int &

多項式多項式開根

閒著沒事幹研究些黑科技(霧) 多項式求逆 求 A(x)*B(x)==1(mod x^n) 其中n為A(x),B(x)的度的較大值 已知A(x)求B(x),B(x)=A(x)^(-1)(mod x^n) 假設n=1,則B(x)=A(x)常數項在mod

多項式多項式多項式開方 學習筆記

前言 還記得上個學期tututu跟我提過多項式的很多操作,還有一些優化常數的奇技淫巧,然而那個時候我一臉懵逼。最近幾天無所事事,去洛谷做比賽又整天被吊著打,閒暇之餘就想著學一下多項式的幾個基本操作。 其實一開始我是想學CZT的,根據myy的論文它能把BZOJ

簡單組合數(除法

#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f const int maxn=1e5+9; #define LL long long int e_gcd(int a,int b

【BZOJ3625】【CF438E】小朋友和二叉樹(生成函式,多項式多項式開根,NTT)

Description 我們的小朋友很喜歡電腦科學,而且尤其喜歡二叉樹。 考慮一個含有n個互異正整數的序列c[1],c[2],...,c[n]。如果一棵帶點權的有根二叉樹滿足其所有頂點的權值都在集合{c[1],c[2],...,c[n]}中,我們的小朋友就會將其稱作神犇的。

Kickstart Round A 2017 Problem A. Square Counting 公式、數論元、除法

Problem Mr. Panda has recently fallen in love with a new game called Square Off, in which players compete to find as many different squares as possible on

多項式除法,開方,任意數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

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

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

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

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

luogu P4512 多項式除法 (模板題、FFT、多項式)

題目連結: https://www.luogu.org/problemnew/show/P4512 沒想到這演算法這麼蠢。。一點都不難啊。。我連這都推不出來我是不是沒救了 這個多項式滿足 A

除法元/費馬小定理

對於正整數和,如果有,那麼把這個同餘方程中的最小正整數解叫做模的逆元。 逆元一般用擴充套件歐幾里得演算法來求得,如果為素數,那麼還可以根據費馬小定理得到逆元為。(都要求a和m互質) 這個為費馬

Luogu5162 WD積木(生成函式+多項式

  顯然的做法是求出斯特林數,但沒有什麼優化空間。   考慮一種暴力dp,即設f[i]為i塊積木的所有方案層數之和,g[i]為i塊積木的方案數。轉移時列舉第一層是哪些積木,於是有f[i]=g[i]+ΣC(i,j)·f[i-j],g[i]=ΣC(i,j)·g[i-j] (j=1~i)。   考慮優化 。我們

Luogu5162 WD積木(生成函數+多項式

積木 math 生成 getch style fin stdin while stream   顯然的做法是求出斯特林數,但沒有什麽優化空間。   考慮一種暴力dp,即設f[i]為i塊積木的所有方案層數之和,g[i]為i塊積木的方案數。轉移時枚舉第一層是哪些積木,於是有f[

【生成函式+多項式】LGP5162 WD積木

【題目】 原題地址 有 n n n塊積木,給每塊積木隨機一個大小並標號,然後將相同大小的積木放在一層,再

[Luogu5162]WD積木(多項式)

不要以為用上Stirling數就一定離正解更近,FFT都是從DP式本身出發的。 設f[i]為i個積木的所有方案的層數總和,g[i]為i個積木的方案數,則答案為$\frac{f[i]}{g[i]}$ 轉移列舉第一層是哪些積木:$$f_n=g_n+\sum_{i=1}^{n}\binom{n}{i}f_{n-

[51nod 1258] [伯努利數] [多項式] [任意數NTT] 序列求和 V4

上次做一套模擬賽的時候,其中需要求自然數k次冪和,然後我只會n^2的…我記得n^2有20分,nlogn求可以爆到90分…… ——鏼鏼鏼2015年國家集訓隊論文 大概就這樣多項式求個逆,求出生成函式就可以了 這樣是O(nlogn),但這道題模數不是滿

luoguP4512 【模板】多項式除法 NTT+多項式+多項式除法

swa define space wap mod inpu eve urn -- Code: #include<bits/stdc++.h> #define maxn 300000 #define ll long long #define MOD

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