zoukankan      html  css  js  c++  java
  • 常系数线性齐次递推新理解

    如果我们要求(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

  • 相关阅读:
    给定一个排序数组,你需要在原地删除重复出现的元素
    OSPF-外部路由
    虚链路
    OSPF域间路由计算,防环
    转 C# 只允许运行一个实例
    转 点击关闭时最小化到任务栏
    C#,int转成string,string转成int
    SQL 查找表名 字段名
    C# *= 运算顺序
    SQL 批量删除表
  • 原文地址:https://www.cnblogs.com/ctmlpfs/p/14772178.html
Copyright © 2011-2022 走看看