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