zoukankan      html  css  js  c++  java
  • 交错排列型容斥

    交错排列型容斥

    引例:(n) 种颜色的球分别 (a_i) 个,相邻不同色,排列,方案数。

    (m=sum a_ile 10^5)

    首先考虑题目中的限制条件是什么,对于单种颜色的球从左往右看,第 (i) 个跟第 (i+1) 个不相邻,那么该颜色就对应着 (a_i-1) 个限制。

    普通容斥,也就是枚举打破多少限制

    [sum_{b_1sim b_n,b_iin[0,a_i-1]} prod_{i=1}^n(-1)^{b_i}{a_i-1choose b_i} imes {(sum a_i-b_i)!over prod_{i=1}^n (a_i-b_i)!} ]

    换成枚举 (c_i=a_i-b_i),然后 (c_i) 的意义是说第 (i) 个颜色强制缩成这么多个段。

    [sum_{c_1sim c_n,c_iin [1,a_i]} (sum c_i)!prod_{i=1}^n(-1)^{a_i-c_i}{(a_i-1)!over (a_i-c_i)!(c_i-1)!}{1over c_i!} ]

    注意到可以按 (sum c_i) 统计答案,那么构造关于后式的普通生成函数

    [F_i(x)=sum_{j=1}^{a_i}(-1)^{a_i-j}{(a_i-1)!over (a_i-j)!(j-1)!j!}x^j ]

    用分治 ntt 卷积以后统计答案即可,复杂度 (O(mlog^2m))

    当然这个是带标号球的拼接,显然可以直接用指数生成函数来理解,本质是一样的。

    2018 集训队作业 - 青春猪头少年不会梦到兔女郎学姐

    给定 (n) 种颜色的球,第 (i) 种颜色的球数量为 (r_i) ,对于一种排列方式,贡献可以如下计算:先把这个序列首尾相连,然后把所有相邻且颜色相同的段拿出来,贡献为他们的长度之积,求所有贡献和。
    ((1,2,1,2))((2,1,2,1)) 贡献相同但排列方式不同,要分别计算。

    (sum r_ile 10^5)

    提交地址:全网没有。

    此题极为毒瘤,必须要一步一步做,我们首先考虑不成环的情况。

    Step 1

    枚举把颜色 (i) 切成 (b_i) 段,设 (f(x,y)) 表示 (x) 有序的切成 (y) 段的所有方案、每段长度乘积之和。

    问题转换为交错排列,直接套用上题的式子,那么有:

    [sum_{a_1sim a_n,a_iin[1,r_i]}f(r_i,a_i)sum_{c_1sim c_n,c_iin [1,a_i]} (sum c_i)!prod_{i=1}^n(-1)^{a_i-c_i}{(a_i-1)!over (a_i-c_i)!(c_i-1)!}{1over c_i!} ]

    (c_i) 整到前面来得到

    [sum_{c_1sim c_n,c_iin [1,r_i]} (sum c_i)!sum_{c_ile a_ile r_i}f(r_i,a_i)prod_{i=1}^n(-1)^{a_i-c_i}{(a_i-1)!over (a_i-c_i)!(c_i-1)!}{1over c_i!} ]

    那么维护生成函数

    [F_i(x)=sum_{j=1}^{r_i}sum_{jle a_ile r_i}f(r_i,a_i)(-1)^{a_i-j}{(a_i-1)!over (a_i-j)!(j-1)!j!}x^j ]

    Step 2

    考虑算这个 (F_i(x))(f(x,y)={x+y-1choose y-1}) ,可以结合组合意义理解,那么也可以推卷积计算了。

    Step 3

    分治 ntt 计算卷积,复杂度 (O(mlog^2 m))

    Step 4

    要做环上的情况,我们钦定颜色 1 在序列最前头并且结尾不是 1,那么用开头是 1 的 - 开头结尾都是 1 的。

    (钦定 (t) 个位置为 1 相当于把 (F_1(x)) 多项式往左平移 (t) 位。)

    这样的一种方案,我们可以通过任意旋转的方式遍历所有可行方案,那么我们最终把答案乘以 (m=sum r_i) 即可。

    Step 5

    然后你发现这样会算重,具体的,一个方案有 (j) 段颜色 1,会被每个 1 遍历一遍,所以算重 (j) 遍,那么可以在颜色 1 的生成函数中带上 (1over j) 的系数来抵消掉,问题才最终解决。

    另外一种未知原理的方法

    考虑计算关于序列的生成函数 (f(x)), 则 (ans=msum_{j=1}^m (j-1)![x^j]f(j))
    如果有知道为什么上式成立的大佬可以在下面评论,博主不胜感激。

  • 相关阅读:
    MacOs 与 Windows 用U盘交换文件
    Tutorial install and use AppImage on Ubuntu 20.10
    How to set FullScreen Mode on MacOS
    Github Fork 之后与源仓库保持同步
    Mac键盘实现Home, End, Page UP, Page DOWN这几个键
    在 Laravel 的数据库模型中使用状态模式
    利用 Linux col 命令过滤手册文档中的控制符
    深入理解 __init__.py 文件在 python3 和 python2 下的不同
    python配置文件INI/TOML/YAML/ENV的区别
    IPython TAB 代码补全问题
  • 原文地址:https://www.cnblogs.com/bestwyj/p/12257112.html
Copyright © 2011-2022 走看看