多項式求逆指的是給定乙個多項式\(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 ...