写在前面:由于我数学基础不好,加上缺乏生成函数知识,所以这一下午我都处在掉线和非掉线的叠加态。而且我写(LaTeX)很慢,所以笔记相当混乱而且不全面。说白了就是我太菜了听不懂。
1.一般生成函数
直接把序列写成多项式的形式。可以做个背包。
- 形式幂级数:只关心系数,不关心(x)的具体取值。只要运算方便,就可以把(x)取任意值来计算。
显然这个东西是不对的,比如(x=2)就gg了。
但是我们硬点(0<x<1),它就是对的。
- 例题:求序列({0,1,4,…,n^2,…})的生成函数。
错位相减法去考虑就好。
2.指数生成函数
形如(f(x)=sum frac{a_ix^i}{i!})的东西,卷积的时候会自动生成一个组合数,适合解决排列组合型问题。
(e^x)在零点处的展开就是上述式子,虽然我不知道怎么展开。
把(x=-x)代入第一个式子,然后两项相加。
同理。
- 循环卷积
大概就是卷积之后对下标取模的结果。
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)。
这是什么?不知道。
- 然后又是一道神题,显然我又掉线了。
- 然后又是一道神题,显然我又掉线了。
- 然后又是一道神题,显然我又掉线了。
- 然后又是一道神题,显然我又掉线了。
嗯,不是你的网卡了。