====== 多项式求逆 ======
准备工作
void calc_rev(int &n,int &lim,const int m) {
n = 1,lim = 0;
while(n < m) n <<= 1,lim++;
for(int i = 1; i < n; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << lim - 1);
}
递归复杂度 $O(nlogn)$
void Inv(const int *a,int *b,const int len) { //多项式求逆
static int c[N];
if(len == 1) {
b[0] = qpow(a[0],mod - 2);
return;
}
Inv(a,b,len + 1 >> 1);
int n,lim;
calc_rev(n,lim,len << 1);
for(int i = 0; i < n; i++) c[i] = a[i];
for(int i = len; i < n; i++) c[i] = 0;
NTT(c,n,1),NTT(b,n,1);
for(int i = 0; i < n; i++) b[i] = (2 - (ll)c[i] * b[i] % mod + mod) * b[i] % mod;
NTT(b,n,-1);
for(int i = len; i < n; i++) b[i] = 0;
}
检查的方法:随机一个多项式求逆两次看看是不是自己。