题目

用 $1,2 ,3 \dots, N$ 代表 $N$ 首歌。设想有 $L$ 个格子排成一排,编号 $1$ 到 $L$ 。考虑将这些数字挨个填进格子里的情形。假设当前要往第 $i$ 个格子里填一个数字(此时前面 $i-1$个坑里都已经填上数字了)若只考虑相邻两个数字不能相同这个条件,则第 $i$ 个格子有 $N-1$ 种填法。不难想到我们还需要知道前 $i-1$ 个格子里填了多少种数字(即多少个不同数字)。

以下描述中,“相邻两个数字不同”这一条件总是满足,不再重复。

以 $f(i,j)$ 表示“前 $i$ 个格子填好之后共有 $j$ 个不同数字”(不必知道这 $j$ 个数字具体是哪些)的方案数。则 $f(i,j)$ 可以转移到 $f(i+1,j)$ 和 $f(i+1,j+1)$,分别对应着第 $i$ 个格子内填余下的 $n-j$ 个数中的某一个和填前 $i$ 个格子中除了第 $i$ 个格子里的数之外的 $j-1$ 个数中的某一个,写成倒推的形式即
\begin{equation*}
f(i, j) = (j-1) f(i-1,j) + (n - j + 1) f(i-1,j-1),
\end{equation*}
边界条件是 $f(1,1) = n$ 。

我们还可以从另一个角度考虑这个问题。

考虑某个合法的播放列表 $a_1, a_2, \dots, a_N$,用 $p_i$ 表示第 $i$ 个新数(即前面没出现过的数)所在的位置(即格子编号)显然有 $p_1 = 1$,$p_2 = 2$,并且 $a_{p_1}, a_{p_2}, \dots, a_{p_N}$ 构成 $1$ 到 $N$ 的一个排列。

考虑映射 $a_1, a_2, \dots, a_N \mapsto a_{p_1}, a_{p_2}, \dots, a_{p_N}$

不难看出,根据上述映射可将所有合法的播放列表分成 $N!$ 类,且每一类中的排列个数相等,将此数目记为 $g(N-1,L-N)$ 。对于 $i = 2, 4, \dots, N$,令 $d_i = p_{i+1} - p_{i}-1$($d_{N+1} = L + 1$)通过枚举 $d_2, \dots, d_N$,我们可以给出 $g(N-1,L-N)$ 的表达式
\begin{equation}
\sum_{\substack{d_2, \dots, d_N \\ \sum_{i=2}^{N}d_i = L - N}} \prod_{i=2}^{N} (i-1)^{d_i}
\end{equation}
那么有
\begin{equation}
g(m, n) = \sum_{\substack{d_1, \dots, d_m \\ \sum_i d_i = n}} \prod_{i=1}^{m} i^{d_i} \label{E:SUM}
\end{equation}

关于 $g(m,n)$,容易得到如下递推式
\begin{equation}
g(m,n) = g(m-1, n) + n g(m, n-1)
\end{equation}
边界条件:$g(1, n) = 1,\,f(m, 0) = 1$
此式的组合意义可以如此理解:第一项 $g(m-1,n)$ 对应于 $d_m = 0$ 的情形,第二项 $n g(m, n-1)$ 对应于 $d_m > 0$ 的情形。

我想知道 \eqref{E:SUM} 式能否进一步化简。

枚举 $d_1, \dots, d_m $ such that $\sum_i d_i = n$,对应着 ordered partition

hihoCoder offer 收割编程练习赛 83 C 播放列表的更多相关文章

  1. hihoCoder [Offer收割]编程练习赛83 D 生成树问题

    题目 从 Kruskal 算法的角度来思考这个问题. 考虑 $n$ 个点的"空图"(即没有边的图). 先将 $m_2$ 条无权值的边加到图中,得到一个森林. 按边权从小到大的顺序枚 ...

  2. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  3. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  4. ACM学习历程—Hihocoder [Offer收割]编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

  5. hihocoder offer收割编程练习赛8 C 数组分拆

    思路:(引自bfsoyc的回答:http://hihocoder.com/discuss/question/4160) 动态规划.状态dp[i]表示 前i个数的合法的方案数,转移是 dp[i] = s ...

  6. hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)

    题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x ...

  7. hihoCoder [Offer收割]编程练习赛3 D子矩阵求和

    子矩阵求和 http://hihocoder.com/discuss/question/3005 声明一下: n是和x一起的,m是和y一起的 x是横着的,y是纵着的,x往右为正,y往下为正 (非常反常 ...

  8. hihocoder [Offer收割]编程练习赛52 D 部门聚会

    看了题目的讨论才会做的 首先一点,算每条边(u, v)对于n*(n+1)/2种[l, r]组合的贡献 正着算不如反着算 哪些[l, r]的组合没有包含这条边(u, v)呢 这个很好算 只需要统计u这半 ...

  9. hihocoder [Offer收割]编程练习赛14

    A.小Hi和小Ho的礼物 谜之第1题,明明是第1题AC率比C还要低.题目是求在n个不同重量袋子选4袋,2袋给A,2袋给B,使2人获得重量相同,求问方案数. 我也是一脸懵b...o(n2)暴力枚举发现把 ...

随机推荐

  1. 【洛谷2522】[HAOI2011] Problem b(莫比乌斯反演)

    点此看题面 大致题意: 求\(\sum_{x=a}^b\sum_{y=c}^d[gcd(x,y)==k]\). 关于另一道题目 在看这篇博客之前,如果你做过一道叫做[BZOJ1101][POI2007 ...

  2. 2017.12.11 String 类中常用的方法

    1.编写程序将 "jdk" 全部变为大写,并输出到屏幕,截取子串"DK" 并输出到屏幕 package demo; import java.util.Scann ...

  3. python_52_函数返回值2

    def test1(x,y): print(x,y) test1(1,2)#位置参数调用,按顺序来,与形参一一对应 test1(y=1,x=2)#输出为2 1,不是1 2.关键字参数调用按关键字,不按 ...

  4. CUDA的软件体系

    CUDA的软件堆栈由以下三层构成:CUDA Library.CUDA runtime API.CUDA driver API,如图所示,CUDA的核心是CUDA C语言,它包含对C语言的最小扩展集和一 ...

  5. dn.net/blueheart20/article/details/22080489

    dn.net/blueheart20/article/details/22080489

  6. 前端小记3——iOS与Android问题

    1.消除transition闪屏 (1)-webkit-transform-style:preserve-3d;  /*设置内嵌的元素在 3D 空间如何呈现:保留 3D*/ (2)-webkit-ba ...

  7. 更改 Linux 语言为中文

    查看当前系统语言环境:    echo $LANG 查看安了哪些中文语言包    locale -a |grep "zh_CN" 没有输出,说明没有安装,输入下面的命令安装     ...

  8. 五、Shell 基本运算符

    Shell 基本运算符 Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令 ...

  9. 一、MySQL 安装

    MySQL 安装 所有平台的 MySQL 下载地址为: MySQL 下载 . 挑选你需要的 MySQL Community Server 版本及对应的平台. 注意:安装过程我们需要通过开启管理员权限来 ...

  10. GPIO实现I2C协议模拟(1)

    最近需要用GPIO模拟I2C协议,如果是在Linux下面比较简单,但在Windows下面,是否有没Linux那么简单了. 索性自己对I2C协议还有一些了解,翻了SPEC并结合示波器量出的实际信号分析, ...