問題:
求多項式\(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)\)求出。
假設我們求出了\(h(x)\),滿足\(f(x)*h(x)\equiv 1\pmod\rceil}}\)。
我們要求\(g(x)\),滿足\(f(x)*g(x)\equiv 1\pmod\)。
進行推導:
\(f(x)*h(x)\equiv 1\pmod\rceil}}\)
\(f(x)*g(x)\equiv 1\pmod\)
\(f(x)*g(x)\equiv f(x)*h(x)\pmod\rceil}}\)(為什麼正確需要考慮模的意義:忽略更高次項)
\(f(x)*(g(x)-h(x))\equiv 0\pmod\rceil}}\)
\(g(x)-h(x)\equiv 0\pmod\rceil}}\)
\((g(x)-h(x))^2\equiv 0\pmod\rceil}}\)
\(g(x)^2-2*g(x)*h(x)+h(x)^2\equiv 0\pmod\rceil}}\)
此時有個結論:
\(g(x)^2-2*g(x)*h(x)+h(x)^2\equiv 0\pmod\)
因為平方前\((g(x)-h(x))\)中\([0,\lceil\frac\rceil-1]\)的係數都為\(0\),考慮\(i\in[\lceil\frac\rceil,n-1]\),\(c_i=\sum\limits_a_j*b_\),其中\(j,i-j\)中必定有乙個屬於\([0,\lceil\frac\rceil-1]\),因此\(c_i=0\)。
兩邊同乘\(f(x)\):
\(g(x)-2*h(x)+f(x)h(x)^2\equiv 0\pmod\)
\(g(x)\equiv2*h(x)-f(x)*h(x)^2\pmod\)
\(g(x)\equiv h(x)*(2-f(x)*h(x))\pmod\)
於是可以遞迴分治求了。
code:
#includeusing namespace std;
typedef long long ll;
const int maxn=4*1e5+10;
const ll mod=998244353;
const ll g=3;
const ll invg=332748118;
int n,lim,len;
int pos[maxn];
ll a[maxn],b[maxn],c[maxn];
inline ll read()
while(c>='0'&&c<='9')res=res*10+c-'0',c=getchar();
return res*f;
}inline ll power(ll x,ll k)
return res;
}void ntt(ll* a,int op)
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...
多項式求逆
給定乙個多項式 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 ...
多項式求逆
多項式求逆指的是給定乙個多項式 f x 求出乙個多項式 g x 滿足 f x g x equiv1 pmod 我們稱乙個多項式的 度 為其最高次項係數 1 首先,我們知道當 n 1 的時候,顯然 g x 即為 f x 的常數項之逆元 我們將原式寫成模 x 意義下的形式 f x g x equiv1 ...