报数(升级版)

md520623 程序题 共 个子题

报数游戏是一个广为流传的休闲小游戏。参加游戏的每个人要按一定顺序轮流报数,但如果下一个报的数是7的倍数,或十进制表示中含有数字7,就必须跳过这个数,否则就输掉了游戏。

在一个风和日丽的下午,刚刚结束SPC20nn比赛的小r和小z闲得无聊玩起了这个报数游戏。但在只有两个人玩的情况下计算起来还是比较容易的,因此他们玩了很久也没分出胜负。此时小z灵光一闪,决定把这个游戏加强:任何一个十进制中含有数字7的数,它的所有倍数都不能报出来!

形式化定义:设 $p(x)$ 表示 $x$ 的十进制表示中是否含有数字7,若含有则 $p(x)=1$,否则 $p(x)=0$。则一个正整数 $x$ 不能被报出,当且仅当存在正整数 $y$ 和 $z$,使得 $x = yz$ 且 $p(y)=1$。

例如:

  • 如果小r报出了6,由于7不能报,所以小z下一个需要报8;
  • 如果小r报出了33,则由于 $34=17\times2$、$35=7\times5$ 都不能报,小z下一个需要报出36;
  • 如果小r报出了69,由于70~79的数都含有7,小z下一个需要报出80才行。

现在小r的上一个数报出了 $x$,小z想快速算出他下一个数要报多少,不过他很快就发现这个游戏可比原版的游戏难算多了,于是他需要你的帮助。当然,如果小r报出的x本身是不能报出的,你也要快速反应过来小r输了才行。

由于小r和小z玩了很长时间游戏,你也需要回答小z的很多个问题。

输入描述

第一行,一个正整数 $T$ 表示小z询问的数量。

接下来 $T$ 行,每行一个正整数 $x$,表示这一次小r报出的数。

输出描述

输出共 $T$ 行,每行一个整数:

  • 如果小r这一次报出的数是不能报出的,输出 -1;
  • 否则输出小z下一次报出的数是多少。

输入样例

样例1输入

4
6
33
69
300

样例1输出

8
36
80
-1

样例2输入

5
90
99
106
114
169

样例2输出

92
100
109
-1
180

提示

样例解释 #1

这一组样例的前3次询问在题目描述中已有解释。

对于第4次询问,由于 $300 = 75 \times 4$,而75中含有7,所以小r直接输掉了游戏。

数据范围

  • 对于10% 的数据,$T \leq 10$,$x \leq 100$;
  • 对于30% 的数据,$T \leq 100$,$x \leq 1000$;
  • 对于50% 的数据,$T \leq 1000$,$x \leq 10000$;
  • 对于70% 的数据,$T \leq 10000$,$x \leq 2 \times 10^5$;
  • 对于100% 的数据,$1 \leq T \leq 2 \times 10^5$,$1 \leq x \leq 10^7$。

本题为编程题,提交代码并运行通过测试点后判分。

正在加载题目数据…
已答 /
子题
该题型需在试卷/作业中作答,单题练习暂不支持
答案解析
提交记录
共 条 仅展示自由练习提交
正在加载提交记录…
讨论
发布
登录后参与讨论 立即登录
发布讨论需先绑定并验证手机号 去绑定手机号
加载中…
我
我
回复 @
回复 @
发送
还没有人讨论,来发表第一条吧