多项式求逆

前言

赶紧补坑

求解

大概是求:
A ( x ) B ( x ) ≡ 1   ( m o d   x n ) A(x)B(x)\equiv1\ (mod\ x^n) A(x)B(x)1 (mod xn)
注意我们可以很容易求:
A ( x ) B ( x ) ≡ 1 ( m o d   x 1 ) A(x)B(x)\equiv1(mod\ x^1) A(x)B(x)1(mod x1)
考虑如何把问题规模减半,假设我们知道了模 x ⌈ n 2 ⌉ x^{\lceil \frac{n}{2} \rceil} x2n的逆元 C ( x ) C(x) C(x)
A ( x ) C ( x ) ≡ 1 ( m o d   x ⌈ n 2 ⌉ ) A(x)C(x)\equiv1(mod\ x^{\lceil \frac{n}{2} \rceil}) A(x)C(x)1(mod x2n)
与原式相减可得:
B ( x ) − C ( x ) ≡ 0 ( m o d   x ⌈ n 2 ⌉ ) B(x)-C(x)\equiv0(mod\ x^{\lceil \frac{n}{2} \rceil}) B(x)C(x)0(mod x2n)
两边平方,注意模域可以平方(手画卷积可以发现):
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)\equiv0(mod\ x^n) B2(x)2B(x)C(x)+C2(x)0(mod xn)
乘上 A ( x ) A(x) A(x)后移项可得:
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) B(x)2C(x)A(x)C2(x)(mod xn)
至此,求解变成子问题,乘法通过FFT优化,可以做到 O ( n log ⁡ n ) O(n\log n) O(nlogn)

模板

void inv(int ln,int *a,int *b){
	if(ln==1){
		b[0]=qpow(a[0],mo-2);
		return;
	}
	inv((ln+1)>>1,a,b);
	int cnt=0;
	for(fn=1;fn<(ln<<1);fn<<=1) ++cnt;
	fo(i,1,fn-1) rev[i]=rev[i>>1]>>1|(i&1)<<(cnt-1);
	fo(i,0,ln-1) c[i]=a[i];
	fo(i,ln,fn-1) c[i]=b[i]=0;
	NTT(c,1),NTT(b,1);
	fo(i,0,fn-1) b[i]=(2-(ll)c[i]*b[i]%mo+mo)%mo*b[i]%mo;
	NTT(b,-1);
	fo(i,ln,fn-1) b[i]=0;
}
posted @ 2019-01-27 22:08  sadstone  阅读(51)  评论(0编辑  收藏  举报