#P16482. [Ural1670]Asterisk星号运算
[Ural1670]Asterisk星号运算
题目背景
最近,奇妙国的数学家发明了一种作用于序列的二元运算“星号” *。
若两个序列分别为 和 ,则
其中 表示把两个序列首尾连接。也就是说,星号运算会把第二个序列放在前面,第一个序列放在后面。
例如:
在没有额外括号时,同一表达式中的星号运算从左到右进行;括号中的运算优先执行。例如:
如果一个序列元素本身是一个表达式,则先计算该表达式,再去掉嵌套序列的括号并展开。例如:
题目描述
给定一个 的排列 。
你需要从按升序书写的数字
出发,只添加圆括号 (、)、逗号 , 和星号 *,构造一个合法表达式,使其计算结果恰好为排列 。
注意:表达式中数字 必须各出现一次,并且在表达式文本中必须按严格升序出现。
合法表达式的形式定义如下:
<expression> ::= <sequence>[*<sequence>...]
<sequence> ::= (<sequence element>[,<sequence element>...])
<sequence element> ::= <number> | <expression>
<number> ::= 1|2|...|N
如果不存在满足要求的表达式,请输出 IMPOSSIBLE。
输入格式
第一行包含一个整数 。
第二行包含 个整数 ,表示目标排列。
输出格式
输出一行。
- 如果存在合法构造,输出任意一个满足要求的表达式;
- 否则输出
IMPOSSIBLE。
输出的表达式还必须满足:
- 不包含空格;
- 所有序列都必须写在圆括号中;
- 表达式长度不超过 个字符;
- 数字 在表达式中各出现一次,并按升序出现。
本题使用特殊判题。满足所有要求的任意表达式均可通过。
样例 1
4
3 4 2 1
(1)*(2)*(3,4)
样例 2
6
5 1 2 6 4 3
IMPOSSIBLE
样例说明
样例 1 中:
继续从左到右计算:
数据范围
输入保证 是 的一个排列。
时间与空间限制
- 时间限制:
- 空间限制: