常系数线性齐次递推新理解

如果我们要求(f_n),我们事实上可以把(f)手动展开
如果(f)是斐波那契递推数列,则(f_5=f_4+f_3=2f_3+f_2=3f_2+2f_1=5f_1+3f_0)
(5f_1+3f_0)这事实上就可以直接按照(a)求了。
考虑列出每次取模数列的生成函数,求(x^nmod p(x))
(p)是一个多项式。
发现(p(x)=x^k-p_1x^{k-1}+...-p^kx^0)
取模的过程事实上就是拿多项式的最高次项更新后面的项,系数为(p)数组内元素。
用多项式乘法实现快速取模。
(x^n)用经典的倍增求。
这种做法理解起来比较简单。

例题1:NOI2017 泳池

例题2:THUSC2017 如果奇迹有颜色

例题3:prophecy
题目的多项式非常像线性递推。
考虑把矩阵乘法内的(+)替换成xor,(*)替换成and,发现矩阵不满足交换律,但是满足结合律。
考虑如何实现多项式操作。
多项式乘法就是把(+)替换成xor,(*)替换成and所得到的乘法
多项式取模只有加法,乘法操作。
单位元可以设置成(2^{32}-1)
例题4:CF865G flowers and chocolate
花的OGF:(A(x)=(sum_{x^{p_i}})^N)
巧克力的生成函数:(B(x)=frac{1}{1-sum_{x^{c_i}}})
根据样例给的提示,我们要求花瓣有(i)个的方案数:(sum_i(A(x)[x^i])(B(x)[x^i]))
如果我们知道了(i),考虑(B)的实际意义,显然是背包dp。
(f_i)表示买了(i)块巧克力,显然有转移(f_i=sum_jf_{i-c_j})(f)的OGF就是(B)
(f)可以常系数线性齐次递推求 ,(B(x)[x^i]=x^imod P(x))(P)是特征多项式。
我们需要枚举(A(x))的每一项求出答案,这太慢了。
我们要求的:(A(x)[x^i])乘以(B(x)[x^i]),就是(i)(c)拼接成的方案数。
发现(mod P(x))事实上是线性的,也是可乘的。
根据常系数线性齐次递推的快速算法的意义,考虑手动展开(A),把(A(x)[x^v])展开成若干项(b)使得(b_i(B(x)[x^{max(c_i)-i}])=)答案。
这可以先求出所有(x^{p_i}mod P(x))的和,然后(N)次方。
求出(B(x))(max(c_i))可以背包。
感觉根据常系数线性齐次递推的快速算法的意义展开比较巧妙。
例题5:codechef TRIPWAYS

例题6:shlw loves matrix II

例题7:「LibreOJ β Round #7」匹配字符串
转化后,变为计算(s_i=2*s_{i-1}-s_{i-m-1})
这事实上是计算dp数组的前缀和
显然能用常系数线性齐次递推的经典算法优化。
下面有(3)种另一种求解(s)的方法,可以推出相同的结果。
1.OGF,列出(s)的OGF (F(x))
(F(x)=2xF(x)-x^{m+1}F(x)+1)
(F(x)=frac{1}{1-(2x-x^{m+1})})
(G(x)=sum_{i=0}^mx^i2^i)(F(x)=sum_{igeq 1}(2x-x^{m+1})^i)
(F(x)[x^n])事实上可以枚举(i)([x^n](2x-x^{m+1})^i=[x^{n-i}](2-x^m)^i)是确定的。
只有(n-imod m=0)时才有意义,设(v=frac{n-i}{m})值是((-1)^v2^{i-v}C_i^v)
2.组合意义
(s)的意义相当于:一个图,设从(0)(n)的路径的权值为它走过的边的权值的乘积。
答案等于走到(n)的所有路径的权值和。
图的构造方法:(i->i+1)连边权为(2)(i->i+m+1)连边权为(-1)的边。
枚举选了多少个(-1),答案是
(inom{n-k*x+x}{x}*2^{n-k*x}*(-1)^{x})
3.容斥
这个公式等同于(f_i=f_{i-1}+...+f_{i-k+1})
这等同于有序选择重量(le k)的物品装进背包的方案数。
考虑枚举选择了多少个重量(geq k)的物品。
则问题转化成了使用若干个重量任意的物品填充背包的方案数。
(n)中间每个元素间都放置(n-1)个隔板,则每个隔板可以拆/不拆,方案数为(2^{n-1})
乘上重量(geq k)的物品在元素序列的选择方案数,得到答案就是(inom{n-k*x+x}{x}*2^{n-k*x}*(-1)^{x})
时间复杂度(O(n^{frac{2}{3}}))
例题8:loj3353

原文地址:https://www.cnblogs.com/ctmlpfs/p/14772178.html