給定乙個多項式 \(f(x)\) ,請求出乙個多項式 \(g(x)\), 滿足 \(f(x) * g(x) \equiv 1 ( \mathrm x^n )\)。係數對 \(998244353\) 取模。
\(n\leq 10^5\)。
假設我們已經知道了 \(f(x)g'(x)\equiv 1\pmod }}\),考慮如何推廣到 \(f(x)g(x)\equiv 1\pmod \)
首先顯然有
\[g(x)-g'(x)\equiv 0\pmod}}
\]兩邊平方後拆開
\[g(x)^2-2g(x)g'(x)+g'(x)^2\equiv 0\pmod}
\]同時乘上 \(f(x)\)
\[g(x)-2g'(x)+g'(x)^2f(x)\equiv 0\pmod}
\]所以
\[g(x)\equiv 2g'(x)-g'(x)^2f(x)\pmod}
\]然後就可以遞推了。
\(t(n)=t(\frac)+o(n\log n)\),故時間複雜度為 \(o(n\log n)\)。
#include using namespace std;
typedef long long ll;
const int n=300010,mod=998244353,g=3,ginv=332748118;
int n,rev[n];
ll f[n],g[2][n],h[n],x[n],y[n];
ll fpow(ll x,ll k)
void ntt(ll *f,int tag,int lim)
for (int i=0;iprintf("%lld ",g[id][i]);
}int main()
洛谷P4238 模板 多項式求逆
題目傳送門 題目分析 放個板子在blog上,以後複習的時候用。注意每一次呼叫poly rev 的時候都要重新計算一遍rev陣列,而且要先清0。求modxm modx m下的逆元的時候,注意ntt的次數界要開到2m,因為a x g2 x a x g2 x 的次數界加起來為m m2 m 2 2 2m 2...
luoguP4238 模板 多項式求逆
令 b x 表示 a x 在 x 下的逆 那麼有 b x 2b x ab x 遞迴一下即可 在 len 1 時直接對常數項求逆即可 這裡一定要注意!取逆的時候是預設 x 的,所以如果在多項式後面多加幾個 0 的話逆是會變的!因為模數改變了!code include include include i...
Luogu 4238 模板 多項式求逆
瘋狂補板中。考慮倍增實現。假設多項式只有乙個常數項,直接對它逆元就可以了。現在假如要求 g x f x g x equiv 1 mod x n 而我們已經求出了 h x f x h x equiv 1 mod x right rceil 兩式相減,f x g x h x equiv 0 mod x ...