• ZROI 19.08.01 生成函数方法


    写在前面:由于我数学基础不好,加上缺乏生成函数知识,所以这一下午我都处在掉线和非掉线的叠加态。而且我写(LaTeX)很慢,所以笔记相当混乱而且不全面。说白了就是我太菜了听不懂。


    1.一般生成函数

    直接把序列写成多项式的形式。可以做个背包。

    • 形式幂级数:只关心系数,不关心(x)的具体取值。只要运算方便,就可以把(x)取任意值来计算。

    [1+x+x^2+…=frac{1}{1-x} ]

    显然这个东西是不对的,比如(x=2)就gg了。

    但是我们硬点(0<x<1),它就是对的。


    • 例题:求序列({0,1,4,…,n^2,…})的生成函数。

    错位相减法去考虑就好。

    [f(x)=sum_{i=0}i^2x^i ]

    [xcdot f(x)=sum_{i=1}(i-1)^2x^i=sum_{i=1}i^2x^i+sum_{i=1}-2icdot x^i+sum_{i=1}x^i ]

    [(1-x)f(x)=2sum_{i=1} icdot x^i-sum_{x=1}x^i=frac{2x}{(1-x)^2}-frac{x}{1-x} ]

    [f(x)=frac{x^2+x}{(1-x)^3}=frac{x(x+1)}{(1-x)^3} ]

    2.指数生成函数

    形如(f(x)=sum frac{a_ix^i}{i!})的东西,卷积的时候会自动生成一个组合数,适合解决排列组合型问题。

    [f(x)=sum_{i=0} frac{x^i}{i!}=e^x ]

    (e^x)在零点处的展开就是上述式子,虽然我不知道怎么展开。

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

    (x=-x)代入第一个式子,然后两项相加。

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

    同理。


    • 循环卷积

    大概就是卷积之后对下标取模的结果。

    FFT的本质就是一维循环卷积,只不过保证(n)(循环节)比较长,所以不会溢出(即,此处不需要取模)。

    也可以扩展到二维,需要对两维都DFT一遍,下标取模。甚至可以扩展到(k)维,对每一维都单独做就好了。


    • 为了循环卷积,我们需要对长度为循环节的数组做DFT,所以接下来老师讲了一个任意长度DFT的(O(klog k))神仙做法,而且我(几乎)听懂了,但是因为公式太长,我记不下来。出处是myy的paper。

    • (n)个点(m)条边的有向图,边权是一个二元组((a_i,b_i)),初始有一个二元组((0,0)),每经过一条边,权值会变为(((x+a_i)mod n, (y+b_i)mod(n-1)))。对每个三元组((i,x,y)),求出从点(i)出发,经过恰好(k)条边回到(i)点,最终权值为((x,y))的方案数。(nleq 22, k leq 10^9)

    显然这是一个二维循环卷积。矩阵快速幂的每个元素看作一个矩阵,乘法定义为二维循环卷积。对每个转移矩阵里的循环卷积矩阵预处理DFT,就能把单次循环卷积的复杂度降为(O(n^2)),再进行矩阵快速幂,总复杂度(O(n^5log k))

    (顺便一提,上面的东西我只能勉强理解,写是不可能写出来的)


    • 接下来是一个神题,好像是循环卷积开根,我掉线了。

    • (m)个点的图,任意一条长度为(k)的倍数的路径会对答案产生(C(n,len))的贡献,答案对(p)取模。(m leq 10,kleq 1000,p equiv1(mod k),nleq 10^{18})

    每个点加一个自环,这样(C(n,len))就转化成了长度恰好为(n)的路径,且贡献都是(1)

    考虑矩阵快速幂,但是每个点需要维护一个长度为(k)的数组,(f_i)表示长度(equiv i (mod k)),这个数组的乘法定义为循环卷积。

    暴力做是(O(m^3k^2log n)),但是可以用我也不会的某种玄妙的插值做出DFT,做到(O(m^3klog n+k^2))


    • 与Polya定理结合:一个(n)个点的环,染成(m)种颜色,要求每种颜色恰好(c_i)个。

    发现可以把Polya定理套进去,直接生成函数做就好。


    • 牛顿迭代

    不会导数,不会Taylor展开,掉线了。


    • 多项式求逆/除法/(ln)/(exp)/多点求值/多点插值

    左转你谷模板区,请。不过NOI到19年也没有考过FFT,估计这东西学了也没啥用。


    • (n)的分拆数(不降整数序列之和)。

    (O(sqrt n))做法:

    对于(a_ileq sqrt n)的情况,可以背包做。

    否则,这样的(a_i)最多(sqrt n)个,可以暴力。

    (O(n log n))做法:

    多项式(ln),多项式积分,多项式(exp)

    这是什么?不知道。


    • 然后又是一道神题,显然我又掉线了。

    • 然后又是一道神题,显然我又掉线了。

    • 然后又是一道神题,显然我又掉线了。

    • 然后又是一道神题,显然我又掉线了。

    嗯,不是你的网卡了。

  • 相关阅读:
    Java:如何正确地使用异常详解
    操作系统:基于页面置换算法的缓存原理详解(下)
    php 分页
    修改css
    /Home/Tpl/Equipment/rangeIndex.html 里调用魔板
    logstash 处理各种时间格式
    MySQL 没有索引 锁全表
    nginx 配置多个主机
    RR 插入不影响
    根据div 标签 查看数组@class=modulwrap 下面的/table/tbody/tr/td
  • 原文地址:https://www.cnblogs.com/suwakow/p/11375071.html
Copyright © 2020-2023  润新知