题目

用 $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. shiro学习记录(三)

    1.使用ehcache缓存权限数据 ehcache是专门缓存插件,可以缓存Java对象,提高系统性能. l ehcache提供的jar包: 第一步:在pom.xml文件中引入ehcache的依赖 &l ...

  2. preprocessing MinMaxScaler

    import numpy as npfrom sklearn.preprocessing import MinMaxScalerdataset = np.array([1,2,3,5]).astype ...

  3. 算法竞赛入门经典5.1 从c到c++

    这个章节主要是讲述了一些c++的特性,在这里面,对我用处最大的应该就是字符串吧.首先是getline,getchar,stringstream的使用了吧. 首先介绍这三个函数. 1. getline函 ...

  4. SpringMVC 多视图解析器 跳转问题

    在SpringMVC的配置文件中加入以下配置: <!--  下面红色的配置必须要在--> <mvc:default-servlet-handler /> <bean id ...

  5. 【前端_js】理解 JavaScript 的 async/await

    async 和 await 在干什么 任意一个名称都是有意义的,先从字面意思来理解.async 是“异步”的简写,而 await 可以认为是 async wait 的简写.所以应该很好理解 async ...

  6. PHP 对象基础知识

    最近开始重新学习对象知识,其实也算是初步深入学习对象和设计模式,希望自己会坚持下去,保持更新 初识PHP对象 还记得,刚开始学习 PHP 的时候,学到到方法和对象时有一个很大的疑问,对象与方法相比较那 ...

  7. Nginx 配置支持 WAF

    WAF(Web Application Firewall),中文名叫做“Web应用防火墙” WAF的定义是这样的:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提 ...

  8. Class:向传统类模式转变的构造函数

    前言 JS基于原型的'类',一直被转行前端的码僚们大呼惊奇,但接近传统模式使用class关键字定义的出现,却使得一些前端同行深感遗憾而纷纷留言:"还我独特的JS"."净搞 ...

  9. RPC框架 - thrift 服务端

    -------服务端程序 ------ 下载    下载 thrift 源代码包    下载 thrift 的bin包 准备描述文件(使用源代码包的示例文件)    \thrift-0.10.0\tu ...

  10. python读取xls文件

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/10/17 14:41 # @Author : Sa.Song # @Desc ...