ACM多项式算法入门

在摸索了很久很久,还是没找到多项式的正确入门方式,所以尝试着自己写一下

内容包含

  • 多项式乘法
  • 多项式求逆
  • 多项式除法
  • 多项式取模
  • 多项式开根(待更新)
  • 多项式求ln(待更新)
  • 多项式求exp(待更新)

多项式乘法

  • 对于多项式 A ( x ) , B ( x ) A(x),B(x) A(x),B(x) A ( x ) = a n x n + a n − 1 x n − 1 + a n − 2 x n − 2 + a n − 3 x n − 3 + . . . + a 1 x + a 0 A(x)=a_nx^n + a_{n-1}x ^ {n-1} + a_{n-2}x ^ {n-2} + a_{n-3}x ^ {n-3} + ... + a_1x + a_0 A(x)=anxn+an1xn1+an2xn2+an3xn3+...+a1x+a0 B ( x ) = b n x n + b n − 1 x n − 1 + b n − 2 x n − 2 + b n − 3 x n − 3 + . . . + b 1 x + b 0 B(x)=b_nx^n + b_{n-1}x ^ {n-1} + b_{n-2}x ^ {n-2} + b_{n-3}x ^ {n-3} + ... + b_1x + b_0 B(x)=bnxn+bn1xn1+bn2xn2+bn3xn3+...+b1x+b0
    G ( x ) = A ( x ) B ( x ) G(x) = A(x)B(x) G(x)=A(x)B(x) 中第 x x x 项的系数 g x = ∑ i + j = x a i b j g_x=\sum_{i+j=x}a_ib_j gx=i+j=xaibj
    这是一个卷积的形式,因此我们可以考虑使用 F F T FFT FFT 或者 N T T NTT NTT 来优化这个卷积,这样就可以在 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)) 时间内实现多项式乘法
void mul(LL* a,int n, LL* b,int m){
   
    for(int i=n+1; i<=Lim; i++) a[i] = 0;
    for(int i=m+1; i<=Lim; i++) b[i] = 0;
    for(int i=0; i<=n; i++) a[i] = (a[i]%P + P) % P; // 第一个多项式系数
    for(int i=0; i<=m; i++) b[i] = (b[i]%P + P) % P; // 第二个多项式系数
    NTT(a,1); NTT(b,1);
    for(int i=0; i<= Lim; i++) a[i] = a[i]*b[i] % P; // O(n)求点值表示法
    NTT(a,-1); // 逆变换变成系数表示法
}

多项式求逆

  • 定义

    • 对于多项式 A ( x ) A(x) A(x) 若存在多项式 B ( x ) B(x) B(x) 满足 A ( x ) B ( x ) = 1   m o d   ( x n ) A(x)B(x)=1 \bmod(x^n) A(x)B(x)=1mod(xn),那么称
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值