#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 的个数更少,因此只能获得该测试点一半的分数。