1. 程式人生 > >2018.12.30 洛谷P4238 【模板】多項式求逆

2018.12.30 洛谷P4238 【模板】多項式求逆

傳送門
多項式求逆模板題。
簡單講講?

多項式求逆

  • 定義:
    對於一個多項式 A ( x ) A(x) ,如果存在一個多項式 B
    ( x ) B(x)
    ,滿足 B ( x )
    B(x)
    的次數小於等於 A ( x ) A(x) A
    ( x ) B ( x ) 1 m o d    x n A(x)B(x)≡1 \mod x^n
    ,那麼我們稱B(x)為 A ( x ) A(x) 在模 x n x^n 意義下的逆元,簡單記作 A 1 ( x ) A^{−1}(x)
  • 求法:
    n = 1 ? n=1? 那不就是 c c 的逆元麼。
    n > 1 ? n>1? 我們令 B ( x ) = A 1 ( x ) B(x)=A^{-1}(x)
    那麼有 A ( x ) B ( x ) 1 m o d    x n A(x)B(x)\equiv 1 \mod x^n
    然後可以用類似倍增的方法求。
    假設我們已經知道 C ( x ) C(x) 滿足 A ( x ) C ( x ) 1 m o d    x n 2 A(x)C(x)\equiv 1\mod x^{\frac n2} (這裡的 n 2 \frac n2 都是向上取整)
    顯然 A ( x ) B ( x ) 1 m o d    x n 2 A(x)B(x)\equiv 1\mod x^{\frac n2} 是成立的。
    我們將兩式相減:
    A ( x ) ( B ( x ) C ( x ) ) 0 m o d    x n 2 A(x)(B(x)-C(x))\equiv 0\mod x^{\frac n2}
    所以 B ( x ) C ( x ) 0 m o d    x n 2 B(x)-C(x)\equiv 0\mod x^{\frac n2}
    然後將兩邊平方:
    B 2 ( x ) 2 B ( x ) C ( x ) + C 2 ( x ) 0 m o d    x n 2 B^2(x)-2B(x)C(x)+C^2(x)\equiv 0\mod x^{\frac n2}
    => B 2 ( x ) 2 B ( x ) C ( x ) + C 2 ( x ) 0 m o d    x n B^2(x)-2B(x)C(x)+C^2(x)\equiv 0\mod x^n
    這一步很關鍵,請神犇們仔細思考原因
    然後兩邊同時乘上 A ( x ) A(x)
    => B ( x ) 2 C ( x ) + A ( x ) C 2 ( x ) 0 m o d    x n ) B(x)-2C(x)+A(x)C^2(x)\equiv 0\mod x^n)
    於是 B ( x ) 2 C ( x ) A ( x ) C 2 ( x ) m o d    x n B(x)\equiv2C(x)-A(x)C^2(x)\mod x^n

乘法可以用 f f t / n t t fft/ntt 加速,因為每次遞迴的時候多項式最高次項都減少一半,所以總複雜度仍然是 O ( n l o g n ) O(nlogn)

程式碼:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
typedef long long ll;
const int mod=998244353;
int n;
inline int ksm(int a,int p){int ret=1;for(;p;p>>=1,a=(ll)a*a%mod)if(p&1)ret=(ll)ret*a%mod;return ret;}
inline int add(const int&a,const int&b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(const int&a,const int&b){return a>=b?a-b:a-b+mod;}
inline int mul(const int