多項式求逆

2022-05-11 04:00:33 字數 1289 閱讀 8813

多項式求逆指的是給定乙個多項式\(f(x)\),求出乙個多項式\(g(x)\)滿足

\[f(x)*g(x)\equiv1\pmod

\]我們稱乙個多項式的「度」為其最高次項係數\(+1\)

首先,我們知道當\(n=1\)的時候,顯然\(g(x)\)即為\(f(x)\)的常數項之逆元

我們將原式寫成模\(x^\)意義下的形式:

\[f(x)*g(x)\equiv1\pmod }

\]假設我們已經求出\(b(x)\)滿足

\[f(x)*b(x)\equiv1\pmod }

\]將兩個式子相減

\[g(x)-b(x)\equiv0\pmod}

\]平方一下

\[g^2(x)-2g(x)b(x)+b^2(x)\equiv0\pmod

\]兩邊乘上\(f(x)\)

\[g(x)-2b(x)+f(x)b^2(x)\equiv0\pmod

\](這裡由於\(f(x)*g(x)\equiv1\pmod\),消去了一些部分)

移項整理得

\[g(x)\equiv(2-f(x)b(x))b(x)\pmod

\]多項式乘法可以用fft/ntt加速

#include #include #include #include #include #include #define inv(x) (fastpow((x),mod-2))

using namespace std;

typedef long long ll;

template void read(t &t)

while(isdigit(c))

if(f)t=-t;

}const ll mod=998244353,gg=3,ig=332748118;

const int maxn=100000+5;

int n;

ll a[maxn<<2],b[maxn<<2];

ll fastpow(ll a,ll b)

return re;

}int len;

int r[maxn<<2];

void ntt(ll *f,int type)

ntt(c,1),ntt(b,1);

for(register int i=0;ib[i]=(2ll-c[i]*b[i]%mod+mod)%mod*b[i]%mod;

ntt(b,0);

fill(b+deg,b+len,0);//重要,因為是在模 x^deg 意義下

}int main()

多項式求逆

你可能覺得這篇部落格很像網上的另一篇,我會告訴你我是抄的無可奉告 w 首先我們來講一些基礎的定義 多項式的度 就是這個多項式的最高次項的次數,記做deg a 對於多項式a x b x 唯一存在多項式q x r x 滿足a x b x q x r x 並且deg r deg b 那麼我們稱q x 為a...

多項式求逆

問題 求多項式 g x 滿足 f x g x equiv 1 pmod q1 這是什麼意思?a1 即 f x g x 最後只有常數項係數為 1 其餘係數都為 0 q2 為什麼要求模 x n a2 這是為了將 n 次方以上的項全都除去,否則 g x 會有無窮多項。用倍增的方法可以 o n log n ...

多項式求逆

給定乙個多項式 f x 請求出乙個多項式 g x 滿足 f x times g x equiv 1 mathrmx n 假設我們已經求得了 g 0 x 滿足 f x times g 0 x equiv 1 mathrmx frac 現在求 f x times g x equiv 1 mathrmx ...