#P14703. [Bulgarian2017]100…0
[Bulgarian2017]100…0
题目描述
Niki 在观察三进制中按顺序写出的数字 0 1 2 时,注意到如果在它们之间加上加号,那么得到的和在三进制中恰好是一个“圆整数”,也就是形如“一个 1 后面跟着一个或多个 0”的数:
0+1+2 = 10(3)
他不禁猜想,这是不是一个普遍规律。遗憾的是,在四进制中尝试 0 1 2 3 时,答案是否定的。
不过 Niki 并没有放弃。他想:“那我允许加入减号呢?”
例如在四进制中:
0-1+2+3 = 10(4)
看起来似乎可行。
但当他在六进制中尝试 0 1 2 3 4 5 时,即使允许在每两个数字之间放置 + 或 -,也依然得不到这种“圆整数”。
于是他进一步放宽条件:并不要求在每两个相邻数字之间都放运算符。没有运算符隔开的数字会直接拼接成该进制下的多位数。这样一来,在六进制中终于能成功,例如:
0+126-3-4+5 = 10(6)
请你编写程序 100,回答 Niki 的问题:
对于给定的 p 进制,能否在按顺序写出的数字之间插入若干个 +、-,或者不插任何符号(表示拼接),使得整个表达式在 p 进制下的结果是一个“圆整数”,即形如一个 1 后面跟着一个或多个 0 的数?
并且,结果越大越好,也就是说,后面跟着的 0 越多越好。
输入格式
输入一行,一个整数 p,表示进制的底数(以十进制给出)。
输出格式
输出一行:
- 如果无解,输出
NO; - 否则输出一个由
+、-、.组成的字符串。
其中:
+和-分别表示加号和减号;.表示对应位置不插入符号,也就是把两侧数字直接拼接。
例如:
- 当
p = 3时,一种输出应为.+.+. - 当
p = 4时,一种输出应为.-.+.+. - 当
p = 6时,一种输出应为.+..-.-.+.
注意:第一个数允许有前导零,也就是说它可以写成 0123... 的形式。
数据范围
2 <= p <= 1000
其中在 20% 的测试点中:
p <= 20
评分方式
测试数据按两两打包的方式评测:只有同一包中的两个测试点都答对时,才获得该包分数。
若你正确判断了“无解”,则可获得该测试点的全部分数。
若你输出了一个合法表达式,并且它在 p 进制下的值是一个“圆整数”,则该输出被认为是正确的。
设该测试点满分为 Q,你所得分数为:
min(Q, Q * (Z / Zmax))
其中:
Z表示你的结果中末尾0的个数;Zmax表示当前已知最优构造中末尾0的最大个数。
样例
输入
10
输出
.+...+.-.+..-..
样例解释
上述输出对应表达式:
0+123+4-5+67-89 = 100
另一个输出:
..+.+..-.+..-..
对应表达式:
01+2+34-5+67-89 = 10
它同样是合法答案,但由于结果末尾 0 的个数更少,因此只能获得该测试点一半的分数。