传送门: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. JS 判断js是加载完成!
  2. 通过pyinotify实现文件的监控,包括监控文件是否传输完成
  3. Google首席决策师告诉你,AI和数据科学团队需要哪10种角色
  4. 【重磅推出】推荐系统系列教程之九:解密“看了又看”和“买了又买”(Item-Based)...
  5. 【数据结构笔记41】散列表/哈希表的性能分享
  6. mysql 表变量_在MySQL中创建表变量
  7. 利用adobe x pro批量合并pdf
  8. 微pe工具箱是微软的吗_电脑装系统用一键装机好用还是微PE工具箱好用
  9. 【四足机器人--支撑相足端反作用力预测】(5)ConvexMPCLocomotion代码解析
  10. 用EasyHMI做的工程示例一览
  11. JavaScript 每日一题 #6
  12. 华为首款台式机计算机发布,华为首款商用台式机一文读懂:商用PC进入智慧时代...
  13. 申请开通自媒体账号的署名文章
  14. 2022.8.29-9.4 AI行业周刊(第113期):世界人工智能大会
  15. VR-AR应用如何改变我们的城市生活?
  16. 辽宁省葫芦岛市谷歌高清卫星地图下载
  17. java canvas 动画效果_八大疯狂HTML5 Canvas及WebGL动画效果
  18. Linux的Matlab使用
  19. 洗牌算法java 剑指_扑克牌的完美洗牌算法
  20. 如何写面向互联网公司的求职简历

热门文章

  1. 全国主要城市空气质量热点图
  2. Appium、adb控制Android手机和实战项目
  3. win7英雄联盟登陆显示无法连接服务器,如何解决Win7玩英雄联盟无法连接到服务器...
  4. 程序员工作2年月薪12K,在线面试指南
  5. 用python实现批量图片的格式转换
  6. python中的闭包函数
  7. django.forms生成HTML,第21天,Django之Form组件
  8. 英语语速测试软件,中英文朗读专家设置语速的操作流程
  9. MQL5 初学者:EA 交易技术指标使用指南
  10. CMake make makefile