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 \]

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

\[(1-x)f(x)=2\sum_{i=1} i\cdot 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(k\log 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)\)的方案数。\(n\leq 22, k \leq 10^9\)

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

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


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

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

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

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

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


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

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


  • 牛顿迭代

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


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

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


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

\(O(\sqrt n)\)做法:

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

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

\(O(n \log n)\)做法:

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

这是什么?不知道。


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

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

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

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

嗯,不是你的网卡了。

posted @ 2019-08-19 08:05  suwakow  阅读(259)  评论(0编辑  收藏  举报
Live2D