NOIP2021 T1 报数
传送门: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 报数相关推荐
- 洛谷 P7960 [NOIP2021] 报数
PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P7960 [NOIP2021] 报数 题目 题目描述 报数游戏是一个广为流传的休闲小游戏.参加游戏的每个人要按一定顺序轮流报数,但如 ...
- 信息学奥赛一本通 2082:【21NOIP提高组】报数 | 洛谷 P7960 [NOIP2021] 报数
[题目链接] ybt 2082:[21NOIP提高组]报数 洛谷 P7960 [NOIP2021] 报数 [题目考点] 1. 筛法求质数 2. 因数 3. 数字拆分 4. 链表思想 [解题思路] 根据 ...
- P7960 [NOIP2021] 报数 埃氏筛法
在世界杯小组赛的前2分钟AC了了这题,然后赶紧趁热写了篇题解 直接上题目 等会儿 这篇文章写了2678字 先赞后看好习惯 题目描述 报数游戏是一个广为流传的休闲小游戏.参加游戏的每个人要按一定顺序轮流 ...
- P7960 [NOIP2021] 报数
原题直通车 大意: 看输入的这个数是否和 7 有关(7的倍数和含有7的倍数),若有关,则输出 -1,否则输出大于这个数且第一个和 7 无关的数. 思路:埃氏筛+判断本身 埃氏筛:找到一个未被记过的数, ...
- 【洛谷P7960】[NOIP2021] 报数【筛法】
ProblemlinkProblem~linkProblem link 分析: 筛子 当前数xxx如果被标记 就跳过 看xxx是否含有777 如果有就把xxx的倍数都标记 记录下下一个报的数即可 CO ...
- P7960 [NOIP2021](洛谷) 报数(筛数)
题目传送门 这道题我们只要把十进制下有七的数筛出啦就万事大吉了 类似于埃氏筛 for(int i=1;i<=10000100;i++){if(a[i])continue;if(check(i)) ...
- P7960 [NOIP2021] 报数 题解
考场上第一眼看到这道题:打表? 于是在半小时的打表+复制后,发现代码长度会超过限制. 所以,本题正解:预处理. ------------分割线------------ 首先,根据题意把数字中有 7 的 ...
- NOIP2021游记
高二了,最后一次参加noip了,AFO 人均过T1,只有我没有切掉qwq,数组没有开到1e7,只开到了2e5,只得到了70pts T2由于没有足够的dp能力,只想到了朴素的状压dp做法,得到了50pt ...
- NOIP2021总结
前言 不得不说,noip2021还是较为友好的,虽然自己答的稀碎挂一堆分但还是侥幸没有AFO 考试过程 騲 进教学楼心态就炸了 忘带核酸报告辣,dayu帮打的( 感动 进错考场辣,各种证件协议交错老师 ...
最新文章
- JS 判断js是加载完成!
- 通过pyinotify实现文件的监控,包括监控文件是否传输完成
- Google首席决策师告诉你,AI和数据科学团队需要哪10种角色
- 【重磅推出】推荐系统系列教程之九:解密“看了又看”和“买了又买”(Item-Based)...
- 【数据结构笔记41】散列表/哈希表的性能分享
- mysql 表变量_在MySQL中创建表变量
- 利用adobe x pro批量合并pdf
- 微pe工具箱是微软的吗_电脑装系统用一键装机好用还是微PE工具箱好用
- 【四足机器人--支撑相足端反作用力预测】(5)ConvexMPCLocomotion代码解析
- 用EasyHMI做的工程示例一览
- JavaScript 每日一题 #6
- 华为首款台式机计算机发布,华为首款商用台式机一文读懂:商用PC进入智慧时代...
- 申请开通自媒体账号的署名文章
- 2022.8.29-9.4 AI行业周刊(第113期):世界人工智能大会
- VR-AR应用如何改变我们的城市生活?
- 辽宁省葫芦岛市谷歌高清卫星地图下载
- java canvas 动画效果_八大疯狂HTML5 Canvas及WebGL动画效果
- Linux的Matlab使用
- 洗牌算法java 剑指_扑克牌的完美洗牌算法
- 如何写面向互联网公司的求职简历