markdown源码https://paste.ubuntu.com/p/wyNvxb4PPQ/

假设在 mod xn\bmod x^n下,多项式AA的逆元是FF,在 mod xn/2\bmod x^{\lceil n/2\rceil}下,多项式AA的逆元是F0F_0,根据多项式求逆的基本公式
F=2F0F02Amod  xn F=2F_0-F_0^2A \mod x^n
首先定义,对于一个多项式FFF(k)F(k)为其在xkx^k时的系数。

(当然,正确的写法是[xk]F[x^k]F,但是写起来不是很方便,因此修改了一下)

展开
F(x)=2F0(x)j=0xF0(j)k=0xjF0(k)A(xjk) F(x)=2F_0(x)-\sum_{j=0}^x F_0(j)\sum_{k=0}^{x-j}F_0(k)A(x-j-k)
首先假设
R(x)=i=0xF0(i)A(xi) R(x)=\sum_{i=0}^x F_0(i)A(x-i)
由逆元的定义可得在x<n2x<\lceil \frac{n}{2}\rceil的情况下,R(x)=[x=0]R(x)=[x=0]

  • 对于x<n2x<\lceil \frac{n}{2}\rceil的情况,可以得到
    F(x)=2F0(x)j=0xF0(j)R(xj) F(x)=2F_0(x)-\sum_{j=0}^x F_0(j)R(x-j)
    由于x<n2x<\lceil \frac{n}{2}\rceil,因此R(xj)R(x-j)只有在j=xj=x时值为11,其他情况都为00,因此
    F(x)=2F0(x)F0(x)=F0(x) F(x)=2F_0(x)-F_0(x)=F_0(x)

  • 对于xn2x\geq \lceil\frac{n}{2}\rceil的情况,由于F0F_0的次数为n21\lceil \frac{n}{2}\rceil-1,因此F0(x)F_0(x)xn2x\geq \lceil \frac{n}{2}\rceil时值为00
    F(x)=j=0xF0(j)R(xj) F(x)=-\sum_{j=0}^x F_0(j)R(x-j)
    xj<n2x-j< \lceil \frac{n}{2}\rceil,则R(xj)=0R(x-j)=0,因此
    F(x)=j=0xn/2F0(j)R(xj) F(x)=-\sum_{j=0}^{x-\lceil n/2\rceil}F_0(j)R(x-j)
    定义
    G=F0[Rxn/2]xn/2 G=-F_0[\frac{R}{x^{\lceil n/2\rceil}}]x^{\lceil n/2\rceil}
    其中,对于一个多项式FF,定义[F][F]FF舍弃k<0,xk\forall k<0,x^k与其系数,例如[6x3+2+5x]=2+5x[6x^{-3}+2+5x]=2+5x

    展开得到
    G(x)=j=0n1F0(j)R(xj)[xjn2] G(x)=-\sum_{j=0}^{n-1}F_0(j)R(x-j)[x-j\geq \lceil \frac{n}{2}\rceil]

    G(x)=j=0xn/2F0(j)R(xj) G(x)=-\sum_{j=0}^{x-\lceil n/2\rceil}F_0(j)R(x-j)
    容易发现
    G(x)=F(x) G(x)=F(x)
    GG在求出RR的基础上只需要求一个n2\lceil \frac{n}{2}\rceil次多项式和一个nn2n-\lceil \frac{n}{2}\rceil次多项式的乘积,较为简便。

代码

inline int getinv(int *s,int len,int *res)
{
  if(len==1)
    {
      res[0]=quickpow(s[0],mod-2);
      return 0;
    }
  int k=(len+1)/2;
  getinv(s,k,res);
  for(int i=0; i<len; ++i)
    {
      tmp[i]=s[i];
    }
  multi(res,k,tmp,len,tmp,len);
  multi(res,k,tmp+k,len-k,res+k,len-k);
  for(int i=k; i<len; ++i)
    {
      if(res[i])
        {
          res[i]=mod-res[i];
        }
    }
  return 0;
}

其中multi(int *a,int lena,int *b,int lenb,int *res,int k)函数代表将多项式a和多项式b乘起来并&VeryThinSpace;mod&VeryThinSpace;xk\bmod x^{k}保存在res数组中。