#agc028b. [agc028_b]Removing Blocks
[agc028_b]Removing Blocks
题目描述
有 个块按照从左到右的顺序排列,编号从 到 。每个块都有一个权重,第 个块的权重是 。Snuke 将对这些块进行 次操作:
- 选择一个尚未被移除的块,然后将它移除。这个操作的代价是与被移除的块相连的块的权重之和(包括被移除的块自身)。这里,两个块 和 ( ) 被称为“相连”,当对于所有的 ( ) ,块 还没有被移除。
对于所有 种 Snuke 移除块的顺序,计算 个操作的总代价,并计算这 个总代价的和。由于答案可能非常大,所以将其对 取模运算。
约束条件
- 输入数据中的所有值均为整数。
输入
从标准输入读入输入数据,输入格式如下:
输出
对于所有 种顺序,计算 个操作的总代价,并输出这 个总代价的和,对 取模。
示例输入1
2
1 2
示例输出1
9
首先,我们考虑顺序 "块 -> 块 "。在第一个操作中,操作的代价是 ,因为块 和 是相连的。在第二个操作中,操作的代价是 ,因为只有块 剩下了。因此,这个顺序下的两个操作的总代价是 。
然后,我们考虑顺序 "块 -> 块 "。在第一个操作中,操作的代价是 ,因为块 和 是相连的。在第二个操作中,操作的代价是 ,因为只有块 剩下了。因此,这个顺序下的两个操作的总代价是 。
因此,答案是 。
示例输入2
4
1 1 1 1
示例输出2
212
示例输入3
10
1 2 4 8 16 32 64 128 256 512
示例输出3
880971923