zoukankan      html  css  js  c++  java
  • 指数型生成函数 及 多项式求ln

    指数型生成函数

    我们知道普通型生成函数解决的是组合问题,而指数型生成函数解决的是排列问题

    对于数列({a_n}),我们定义其指数型生成函数为

    [G(x) = a_0 + a_1x + a_2frac{x^2}{2!} + a_3frac{x^3}{3!} + a_4frac{x^4}{4!} + dots = sumlimits_{i = 0}^{infty} a_ifrac{x^i}{i!} ]

    那么对于两个数列({a_n})({b_n}),其对应成生成函数为

    [G(x) = sumlimits_{i = 0}^{infty} a_ifrac{x^i}{i!} ]

    [F(x) = sumlimits_{i = 0}^{infty} b_ifrac{x^i}{i!} ]

    那么

    [egin{aligned} F(x) centerdot G(x) &= (sumlimits_{i = 0}^{infty} a_i frac{x^i}{i!})(sumlimits_{i = 0}^{infty} b_i frac{x^i}{i!}) \ &= sumlimits_{n = 0}^{infty} (sumlimits_{i = 0}^{infty} frac{a_ix^i}{i!} centerdot frac{b_{n - i}x^{n - i}}{(n - i)!})x^n \ &= sumlimits_{n = 0}^{infty} (sumlimits_{i = 0}^{infty} {n choose i} a_i b_{n - i}) frac{x^n}{n!} end{aligned} ]

    由此可见两个指数型生成函数相乘,如果(x^i)的系数表示的是选择(i)个该物品的方案数,那么(F(x) centerdot G(x))(x^i)的系数表示的就是从(a)(b)中选出(i)个物品的排列数

    一般地,对于多重集合(M),从中选取(k)个元素的排列数,若限定元素(a_i)出现的次数集合为(M_i),则该组合数序列的生成函数为

    [prodlimits_{i = 1}^{n}(sumlimits_{m in M_i} frac{x^m}{m!}) ]

    泰勒展开式

    通常,在指数型生成函数的使用过程中,一般都会用到泰勒展开式:

    [e^{x} = sumlimits_{i = 0}^{infty} frac{x^i}{i!} = 1 + x + frac{x^2}{2!} + frac{x^3}{3!} + frac{x^4}{4!} + dots + frac{x^n}{n!} + dots ]

    扩展的一些式子:

    [frac{e^x + e^{-x}}{2} = sumlimits_{i = 0}^{infty} frac{x^{2i}}{(2i)!} ]

    [frac{e^x - e^{-x}}{2} = sumlimits_{i = 0}^{infty} frac{x^{2i + 1}}{(2i + 1)!} ]

    还有一些比较有用的公式:

    [frac{1}{1 - x} = sumlimits_{i = 0}^{infty} x^i ]

    [ln(1 + x) = sumlimits_{i = 0}^{infty} (-1)^{i} frac{x^{i + 1}}{i + 1} ]

    [(1 + x)^{a} = sumlimits_{i = 0}^{infty} a^{underline{i}}frac{x^i}{i!} ]

    [sin(x) = sumlimits_{i = 0}^{infty} (-1)^{i}frac{x^{2i + 1}}{(2i + 1)!} ]

    [cos(x) = sumlimits_{i = 0}^{infty} (-1)^{i}frac{x^{2i}}{(2i)!} ]

    多项式求(ln)

    意义?
    我们要求将一个集合大小为(n)的方案数,逆向思考
    假如我们求出了生成函数(F(x)),其中(x^i)项的系数表示集合大小为(i)的方案数
    我们构造一个函数

    [G(x) = frac{F(x)}{1!} + frac{F^2(x)}{2!} + frac{F^3(x)}{3!} + dots ]

    观察式子发现(G(x))(x^i)的系数实际上就是选出若干集合大小刚好为(i)的方案数
    假设这个方案数很好求,我们能很快构造出(G(x)),我们现在要求(F(x))的话就要使用多项式求(ln)
    观察

    [G(x) = frac{F(x)}{1!} + frac{F^2(x)}{2!} + frac{F^3(x)}{3!} + dots = e^{F(x)} ]

    [F(x) = lnG(x) ]

    求法

    假如我们要求(G(x) = lnF(x))
    求导得

    [G'(x) = frac{F'(x)}{F(x)} ]

    [G(x) = int frac{F'(x)}{F(x)} dx ]

    所以我们只需多项式求导,多项式求逆,多项式乘法,多项式积分
    复杂度(O(nlogn))

    例题BZOJ3456城市规划

  • 相关阅读:
    功能测试--电梯测试项
    进程
    基于UDP协议的socket编程
    自定义报头解决粘包问题
    基于TCP协议的socket编程
    python3 中encode 和decode的使用方法。
    反射---hasattr、getattr、setattr、delattr
    摘要算法---hashlib模块下MD5和SHA的使用
    日志模块---logging
    staticmethod、classmethod的使用
  • 原文地址:https://www.cnblogs.com/Mychael/p/9187796.html
Copyright © 2011-2022 走看看