• Square(斯特林反演)


    题意

    给出一个 (n × m) 大小的矩形,每个位置可以填上 ([1, c]) 中的任意一个数,要求填好后任意两行互不等价且任意两列互不等价,两行或两列等价当且仅当对应位置完全相同,求方案数 。

    (n, m le 5000)

    题解

    这题是 Wearry 出的神题,根本不会做。。。把题解搬过来了。

    首先我们有一个很简单的方式使得列之间互不等价,对于任意一列,总方案数是 (c^n) , 那么使得列与列之间互不相同的方案数为 ({(c^n)}^{underline{m}})

    接下来的问题只与行数有关 , 定义 (g(n)) 表示 (n) 行不保证每行互不等价的方案数 , (f(n)) 表示 (n) 行保证任意两行互不等价的方案数 , 有 :

    [egin{align} g(n) &= {(c^n)}^{underline{m}}\ &= sum_{i=0}^{n} {n race i} f(i)\ end{align} ]

    考虑这个式子的意义,就是枚举了有几行是不同的,然后将 (n) 行分成这 (i) 种不同的行(每个非空)的方案。

    然后考虑斯特林反演就行了。(此处指不带符号的第一类斯特林数)

    [egin{align} g(n) &= sum_{i=0}^{n} {n race i} f(i) \ Leftrightarrow f(n) &= sum_{i=0}^{n} (-1)^{n-i} egin{bmatrix}n\ iend{bmatrix} g(i) end{align} ]

    然后在 (O(nm)) 的时间里求出第一类斯特林数,就可以做完了。

    其实还有更快的求法,但是对于这题原来数据没有必要。

    见此博客 orz orz 生成函数大师 SunwayShichengLight 。

    瓶颈在分治 (NTT) 处理下降幂那里,可以优化到 (O(n log^2 n))

    总结

    对于行列计算方案的题,常常可以考虑枚举一维,用容斥或者斯特林反演做。

    对于另外一维可以快速计算可行的方案,来除掉一维的限制。

    代码

    自己写

  • 相关阅读:
    通用指令-数据库通用操作
    通用指令-key通用操作
    数据类型-sorted_set类型基本操作和扩展操作
    数据类型-set类型基本操作和扩展操作
    数据类型-list类型基本操作和扩展操作
    数据类型-hash类型基本操作和扩展操作
    ORACLE 函数 NVL, NVL2, NULLIF
    maven 配置jdk版本
    maven仓库添加自己的jar包
    Map 中的EntrySet()
  • 原文地址:https://www.cnblogs.com/zjp-shadow/p/9755635.html
Copyright © 2020-2023  润新知