• [模板] 多项式求逆


    多项式求逆

    作用

    [f(x)g(x)equiv 1 mod x^n ]

    那么称(g(x))(f(x))的逆元,也记作(f^{-1}(x))。若(deg f^{-1} < n),则(f^{-1})唯一。

    实现

    进行一些简单的导的推:

    (f^{-1}_0)(x^{lceil frac{n}{2} ceil})(f)的逆元,已经被计算出来。注意这里(f^{-1}_0)(lceil frac{n}{2} ceil-1)度的多项式,而(f)是原多项式,(deg f ge frac{n}{2})。有:

    [f^{-1}_0fequiv1 mod x^{lceil frac{n}{2} ceil} ]

    (f^{-1})(f)的逆元,有

    [f^{-1}fequiv1 mod x^{lceil frac{n}{2} ceil} ]

    两式相减,有

    [f_0^{-1}-f^{-1}equiv 0 mod x^{lceil frac{n}{2} ceil} ]

    平方有

    [egin{aligned} (f_0^{-1}-f^{-1})^2 &equiv 0 mod x^n \ f_0^{-2}+f^{-2}-2f_0^{-1}f^{-1}&equiv0 mod x^n end{aligned} ]

    两端乘以(f),注意这里是(mod x^n),故(f_0^{-1}f eq 1),而(f^{-1}fequiv 1),有

    [egin{aligned} ff_0^{-2}+ff^{-2}-2ff_0^{-1}f^{-1} &equiv0 &mod x^n \ ff_0^{-2}+f^{-1}-2f_0^{-1}&equiv0 &mod x^n \ f^{-1}&equiv f_0^{-1}(2-ff_0^{-1})&mod x^n \ end{aligned} ]

    这样就算出了模(x^n)下的逆元(f^-1),递归算下去。(ff_0^{-1})直接使用ntt或fft,时间复杂度(T(n)=T(frac{n}{2})+O(nlog n)=O(nlog n))

    实现中,把(n)扩大成2的幂次,方便计算。事实上不用也可。

    ll f[N], rf[N]; // 临时
    void solve(int len, ll x[], ll y[]) { // 求逆,y=x^-1, len=2^k
        if(len == 1) {
            y[0] = x[0];
            return ;
        }
        solve(len >> 1, x, y);
        for(int i = 0 ;i < (len << 1); i++) {
            f[i] = rf[i] = 0;
        }
        for(int i = 0; i < len / 2; i++) {
            rf[i] = y[i];
        }
        for(int i = 0; i < len; i++) {
            f[i] = x[i];
        }
        ntt(f, len << 1, 1);
        ntt(rf, len << 1, 1);
        for(int i = 0; i < (len << 1); i++) {
            rf[i] = rf[i] * (2 - rf[i] * f[i] % M + M) % M;
        }
        ntt(rf, len << 1, -1);
        for(int i = 0; i < len; i++) y[i] = rf[i];
    }
    

    例题

    分治 FFT(多项式求逆,分治fft)

  • 相关阅读:
    数据库索引的作用和长处缺点
    Spring的依赖注入
    Spring+Ibatis集成开发实例
    IOS开发之类和对象
    关于C++ const 的全面总结
    包管理器Bower使用手冊之中的一个
    项目总算完工了
    git reset and git checkout
    unity3D中协程和线程混合
    【剑指offer】左旋转字符串
  • 原文地址:https://www.cnblogs.com/limil/p/15350714.html
Copyright © 2020-2023  润新知