传送门:NOIP2021 T1

题目大意

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

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

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

例如,如果小 r 报出了 6 ,由于 7 不能报,所以小 z 下一个需要报 8;如果小 r 报出了 33,则由于 34=17×234 = 17 \times 234=17×2,35=7×535 = 7 \times 535=7×5 都不能报,小 z 下一个需要报出 36 ;如果小 r 报出了 69,由于 70∼7970 \sim 7970∼79 的数都含有 7,小 z 下一个需要报出 80 才行。

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

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

分析

  一看这题,好像很好做嘛,不就是把数字中带 7 的和这些数的倍数直接筛掉就好了吗。就像这样:

/*
is[i] 表示第数字 i 可不可以报再取个反
ans[i] 表示的是第 i 个可以报的数字
*/
for(int i = 1; i <= 1e7 + 1000; i++){if(is[i]) continue;                                               // 如果不能报就直接跳过int temp = i;while(temp){                                                      // 看这个数字中有没有 7int ttemp = temp % 10;temp /= 10;if(ttemp == 7)                                                // 如果有就把这个数和它的倍数都标记为不能报的数for(int j = 1; j * i <= 1e7 + 1000; j++) is[i * j] = 1;}
}
for(int i = 1; i <= 1e7 + 1000; i++)if(!is[i]) ans[++cnt] = i;

  这里要注意,枚举 iii 的范围需要在题目的最大的基础上加上一小段,因为可能题目刚好问你 1e71e71e7 的下一个该报什么数字,这个数就会比 1e7 大。

  然后是查询的部分,我们只需要在 ans 数组里面二分就可以了。根据题目给出的这个数,找到在 ans 数组中大于等于它的第一个数,因为我们找的是大于等于的数,所以如果我们找到的刚好等于题目给的数那么答案就是 ans 数组中的下一个数。如果我们找到的这个数大于题目给的数,那么题目要求的这个数就在 ans 数组里不存在,也就说明这个数不能被报出来,也就输出 -1。就是这样:

while(t--){int x = in;                                            // 输入int idx = lower_bound(ans+1, ans+cnt+1, x) - ans;      // 在数组中二分,找到大于等于 x 的第一个数的下表if(ans[idx] != x) cout << -1 << endl;                  // 如果这个数和 x 不相等,说明 x 不在 ans 数组中,所以输出 -1else cout << ans[idx + 1] << endl;                     // 否则就输出下一个数
}

代码

  完整代码如下:

#include<bits/stdc++.h>
using namespace std;
#define in read()
#define MAXN (int)(1e7 + 1000)
#define endl '\n'inline int read(){int x = 0; char c = getchar();while(c < '0' or c > '9') c = getchar();while('0' <= c and c <= '9'){x = x * 10 + c - '0'; c = getchar();}return x;
}int t = 0;int cnt = 0;
int ans[MAXN] = { 0 };
bool is[MAXN] = { 0 };void init(){for(int i = 1; i <= 1e7 + 1000; i++){if(is[i]) continue;int temp = i;while(temp){int ttemp = temp % 10;temp /= 10;if(ttemp == 7)for(int j = 1; j * i <= 1e7 + 1000; j++) is[i * j] = 1;}}for(int i = 1; i <= 1e7 + 1000; i++)if(!is[i]) ans[++cnt] = i;
}int main(){freopen("number.in", "r", stdin);freopen("number.out", "w", stdout);init();t = in;while(t--){int x = in;int idx = lower_bound(ans+1, ans+cnt+1, x) - ans;if(ans[idx] != x) cout << -1 << endl;else cout << ans[idx + 1] << endl;}return 0;
}

NOIP2021 T1 报数相关推荐

  1. 洛谷 P7960 [NOIP2021] 报数

    PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P7960 [NOIP2021] 报数 题目 题目描述 报数游戏是一个广为流传的休闲小游戏.参加游戏的每个人要按一定顺序轮流报数,但如 ...

  2. 信息学奥赛一本通 2082:【21NOIP提高组】报数 | 洛谷 P7960 [NOIP2021] 报数

    [题目链接] ybt 2082:[21NOIP提高组]报数 洛谷 P7960 [NOIP2021] 报数 [题目考点] 1. 筛法求质数 2. 因数 3. 数字拆分 4. 链表思想 [解题思路] 根据 ...

  3. P7960 [NOIP2021] 报数 埃氏筛法

    在世界杯小组赛的前2分钟AC了了这题,然后赶紧趁热写了篇题解 直接上题目 等会儿 这篇文章写了2678字 先赞后看好习惯 题目描述 报数游戏是一个广为流传的休闲小游戏.参加游戏的每个人要按一定顺序轮流 ...

  4. P7960 [NOIP2021] 报数

    原题直通车 大意: 看输入的这个数是否和 7 有关(7的倍数和含有7的倍数),若有关,则输出 -1,否则输出大于这个数且第一个和 7 无关的数. 思路:埃氏筛+判断本身 埃氏筛:找到一个未被记过的数, ...

  5. 【洛谷P7960】[NOIP2021] 报数【筛法】

    ProblemlinkProblem~linkProblem link 分析: 筛子 当前数xxx如果被标记 就跳过 看xxx是否含有777 如果有就把xxx的倍数都标记 记录下下一个报的数即可 CO ...

  6. P7960 [NOIP2021](洛谷) 报数(筛数)

    题目传送门 这道题我们只要把十进制下有七的数筛出啦就万事大吉了 类似于埃氏筛 for(int i=1;i<=10000100;i++){if(a[i])continue;if(check(i)) ...

  7. P7960 [NOIP2021] 报数 题解

    考场上第一眼看到这道题:打表? 于是在半小时的打表+复制后,发现代码长度会超过限制. 所以,本题正解:预处理. ------------分割线------------ 首先,根据题意把数字中有 7 的 ...

  8. NOIP2021游记

    高二了,最后一次参加noip了,AFO 人均过T1,只有我没有切掉qwq,数组没有开到1e7,只开到了2e5,只得到了70pts T2由于没有足够的dp能力,只想到了朴素的状压dp做法,得到了50pt ...

  9. NOIP2021总结

    前言 不得不说,noip2021还是较为友好的,虽然自己答的稀碎挂一堆分但还是侥幸没有AFO 考试过程 騲 进教学楼心态就炸了 忘带核酸报告辣,dayu帮打的( 感动 进错考场辣,各种证件协议交错老师 ...

最新文章

  1. 那个专攻JVM的00后求职者,薪水比我的还高···
  2. [UE4]C++实现动态加载的问题
  3. 【干货】Duang!看好产品是如何增加情感化设计的?
  4. (十二)java版电子商务spring cloud分布式微服务- Spring 4.2.2以上版本和swagger集成方案和踩过的坑...
  5. mybatisplus where语句里面的条件用括号括起来
  6. 『Linux基础 - 4 』linux常用命令(1)
  7. JVM架构和GC垃圾回收机制--面试
  8. 论文浅尝 | 基于Freebase的问答研究
  9. python惰性求值效果_让Python中类的属性具有惰性求值的能力
  10. win10连接VMWare下的Ubutun系统进行FPT文件传输
  11. 关于跨域的处理的几种方法的整理
  12. Dialog详解(包括进度条、PopupWindow、自定义view、自定义样式的对话框)
  13. 计算机多功能教室管理制度,多媒体教室管理制度
  14. oracle用plsql导出表结构与数据
  15. latex如何设置字体并加粗_LaTeX字体设置
  16. Dapper使用技巧和基础CRUD
  17. 量子点、量子点发光、量子点屏幕究竟是什么?
  18. 2019 原创技术干货整理
  19. 后端返回PDF文件流,前端处理展示及打印
  20. add_months用法解析

热门文章

  1. Linux系统删除Firefox,Linux系统如何卸载安装火狐浏览器
  2. K8s之就绪探针和存活探针
  3. uniapp-微信小程序使用高德或腾讯地图的导航功能
  4. 微信公众号开发 公众号接口开发 封装统一的GET/POST请求接口
  5. 香橙派iot板子编译过程_编译过程并不神奇
  6. 看新闻新疆列车被吹翻后有感.
  7. 优秀的 OKR 案例参考
  8. 【Opencv实战】素描,要画出感觉,比如像这样画:画啥啥都好看(建议保存)
  9. 开发者入门必读:最值得看的十大机器学习公开课
  10. C语言实现稀疏矩阵存储和转置