多项式求逆
前言
赶紧补坑
求解
大概是求:
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}
x⌈2n⌉的逆元
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 x⌈2n⌉)
与原式相减可得:
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 x⌈2n⌉)
两边平方,注意模域可以平方(手画卷积可以发现):
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;
}