码迷,mamicode.com
首页 > 其他好文 > 详细

Square(斯特林反演)

时间:2018-10-08 18:06:14      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:有关   inline   不同   就是   定义   个数   span   hub   问题   

题意

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

\(n, m \le 5000\)

题解

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

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

接下来的问题只与行数有关 , 定义 \(g(n)\) 表示 \(n\) 行不保证每行互不等价的方案数 , \(f(n)\) 表示 \(n\) 行保证任意两行互不等价的方案数 , 有 :
\[ \begin{align} g(n) &= {(c^n)}^{\underline{m}}\ &= \sum_{i=0}^{n} {n \brace i} f(i)\\end{align} \]
考虑这个式子的意义,就是枚举了有几行是不同的,然后将 \(n\) 行分成这 \(i\) 种不同的行(每个非空)的方案。

然后考虑斯特林反演就行了。(此处指不带符号的第一类斯特林数)
\[ \begin{align} g(n) &= \sum_{i=0}^{n} {n \brace i} f(i) \\Leftrightarrow f(n) &= \sum_{i=0} (-1)^{n-i} \begin{bmatrix}n\\ i\end{bmatrix} g(i) \end{align} \]
然后在 \(O(nm)\) 的时间里求出第一类斯特林数,就可以做完了。

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

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

总结

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

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

代码

自己写

Square(斯特林反演)

标签:有关   inline   不同   就是   定义   个数   span   hub   问题   

原文地址:https://www.cnblogs.com/zjp-shadow/p/9755635.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!