在藏蓝铁路的碧水湖大桥落成之际,一群铁路工程蚤聚在一起,庆祝这一伟大的建筑工程。
他们在桥上放置了代表各个工程团队的
根据工程蚤 M 蚤的说法,他们为了保证碧水湖大桥的稳定性,特意研制了一种名为「跳蚤搭堆法」的搭建材料方法。为了体现这种方法的优越性,每个石堆由至少一个石子按顺序排布再根据「跳蚤搭堆法」依次搭建形成,相当于可以用一个非空有序列表描述,石子的数量代表了该团队所贡献的资源数量。每个石子还根据其大小分配了一个不大于
为了纪念这一时刻,工程蚤们决定将这些石堆合并成一个大石堆,从而来构建一个代表团结和合作的雕塑。
由于「跳蚤搭堆法」的特性,合并两个石堆
#define stone int
#define stones std::vector<stone>
stones merge(stones A, stones B)
{
stones C;
while (A.size() && B.size())
if (A[0] <= B[0])
C.push_back(A[0]), A.erase(A.begin());
else
C.push_back(B[0]), B.erase(B.begin());
while(A.size())
C.push_back(A[0]), A.erase(A.begin());
while(B.size())
C.push_back(B[0]), B.erase(B.begin());
return C;
}
返回的石堆就是最终搭建的结果。
作为睿智的数学家伏特,你当然看出来这就是所谓的「二路归并算法」,只是石堆内部的石子不一定有序。
工程蚤们首先选择了一个基础的石堆
合并的规则如下:对于
完成所有合并后,他们惊奇地发现:
这个时候跳蚤国王来了,他看到这个雕塑非常满意。他问道:“在开始的时候,这些石堆是怎样的呢?”
他想知道,给定合并后的石堆,有多少种可能的初始石堆
作为杰出的数学家伏特,你能帮助跳蚤国王解决这个问题吗?
你需要计算有多少种可能的初始石堆形态,并输出答案模
简要题意
目前有
对
现给定
无解时请输出
输入格式
第一行三个整数
接下来一行
输出格式
一行一个整数,表示方案数对
样例一
input
3 8 0 1 3 4 2 5 2 7 8
output
540
样例二
input
4 8 0 2 4 1 4 1 2 3 2
output
0
样例三 样例二十
见附件下载。
M 蚤的小提示
为了方便非 C++ 选手的理解,善良的 M 蚤给了你在「跳蚤搭堆法」下合并两个石堆的一份伪代码:
数据范围
所有数据保证
具体的数据规模分布可以见下表。
子任务编号 | 分值 | 子任务依赖 | |||
---|---|---|---|---|---|
无 | |||||
无 | |||||
无 | |||||
无 | |||||
无 | |||||
接下来阐述关于
- 当
时,保证 。 - 当
时,保证 。 - 当
时,保证每种编号出现次数均不超过 次。
时间限制:
空间限制: