do_while_true

一言(ヒトコト)

「题解」HDU 7095 / 2021 年百度之星·程序设计大赛 - 复赛 B Add or Multiply 1

你有一个数字 \(x\) 和若干个操作,每个操作是 \(+a_i\) 或者乘 \(\times a_i\) 中的一种。你可以重新排列这些操作的顺序,然后对数字 \(x\) 执行这些操作。

比如说三个操作是 \(+a_1,+a_2,\times a_3\)。如果按顺序执行这三个操作,那么得到的结果是 \(((x+a_1)+a_2)\times a3\)。如果排列成 \(+a_2,\times a_3,+a_1\),那么得到的结果是 \(((x+a_2)\times a_3)+a_1\)

我们会发现,有一些操作顺序计算出来的结果是本质相同的,比如说 \(+a_1,+a_2,\times a_3\) 和 $+a_2,+a_1,\times a_3 $这样运算下来结果是一样的。我们认为两个操作顺序计算的结果本质相同,当且仅当无论代入什么数,计算出来的结果都是一样的。

请问有多少种本质不同的操作序列。换句话说就是最多能找到多少个操作序列,使得这些操作序列任意两个都不是本质相同的。由于答案很大,输出对 \(10^9+7\) 取模的结果。

在这个题目中,我们只会给出加法操作和乘法操作的个数,分别是 \(n,m\),并不会给出具体的顺序和数字。容易发现,答案与具体的顺序和数字无关。

\(T\) 组询问,\(1\leq T\leq 10^4,1\leq n,m\leq 3000\)

\(x\) 个有标号球放进 \(y\) 个有区分非空盒子方案数 \(=\ y!\times\)\(x\) 个有标号球放进 \(y\) 个无区分非空盒子方案数 \(=\ \begin{Bmatrix}x\\y\end{Bmatrix}y!\),设其为 \(calc(x,y)\)

其中 \(\begin{Bmatrix}x\\y\end{Bmatrix}\) 为第二类斯特林数。

考虑枚举有 \(i\) 个连起来的乘法块,那么其方案数为 \(calc(m,i)\)

\(i\) 个乘法块形成了 \((i+1)\) 个空隙,两边的 \(2\) 个可空,中间的 \((m-1)\) 个非空。

\(n\) 个加法有三种方法:

  1. 只放中间 \((m-1)\) 个(钦点两个可空的都不放):\(calc(n,i-1)\)

  2. 钦点一个可空的为非空的,另一个不放:\(calc(n,i)\times 2\)

  3. 钦点两个可空的为非空的:\(calc(n,i+1)\)

故答案为

\[\sum_{i=1}^mcalc(m,i)\times(calc(n,i-1)+calc(n,i-1)\times 2+calc(n,i+1)) \]

时间复杂度为 \(\mathcal{O}(m^2+Tm)\)

Code

posted @ 2021-08-22 10:02  do_while_true  阅读(302)  评论(0编辑  收藏  举报