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

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

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

比如说三个操作是 +a1,+a2,×a3。如果按顺序执行这三个操作,那么得到的结果是 ((x+a1)+a2)×a3。如果排列成 +a2,×a3,+a1,那么得到的结果是 ((x+a2)×a3)+a1

我们会发现,有一些操作顺序计算出来的结果是本质相同的,比如说 +a1,+a2,×a3+a2,+a1,×a3这样运算下来结果是一样的。我们认为两个操作顺序计算的结果本质相同,当且仅当无论代入什么数,计算出来的结果都是一样的。

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

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

T 组询问,1T104,1n,m3000

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

其中 {xy} 为第二类斯特林数。

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

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

n 个加法有三种方法:

  1. 只放中间 (m1) 个(钦点两个可空的都不放):calc(n,i1)

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

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

故答案为

i=1mcalc(m,i)×(calc(n,i1)+calc(n,i1)×2+calc(n,i+1))

时间复杂度为 O(m2+Tm)

Code

posted @   do_while_true  阅读(321)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?

This blog has running: 1845 days 1 hours 33 minutes 38 seconds

点击右上角即可分享
微信分享提示