题解:P4238 【模板】多项式乘法逆
ILearnedSomeCoding · · 题解
算法介绍
设
我们需要求
假如
所以就可以递归求了。
时间复杂度:
假如
然只要实现多项式乘法就行了。模
代码
int mod_inv(int n){
return qpow(n, MOD - 2);
}
void memset_(int *a, int x, int y){
for(int i = x;i <= y;i++)a[i] = 0;
}
void inv(int n, int *a, int *b){
if(n == 1){
b[0] = mod_inv(a[0]);
return;
}
int m = (n + 1) / 2;
inv(m, a, b); // b = inv(a) (mod x^(n/2))
int len = 1;
while(len < n * 2)len <<= 1;
for(int i = 0;i < n;i++)c[i] = a[i];
memset_(c, n, len - 1);
memset_(b, m, len - 1);
ntt(c, len, 0);
ntt(b, len, 0);
for(int i = 0;i < len;i++){
ll t = 1ll * c[i] * b[i] % MOD;
t = (2 - t + MOD) % MOD;
b[i] = (t * b[i] % MOD); // b = b(2-bc)
}
ntt(b, len, 1);
memset_(b, n, len - 1);
}