【21NOIP提高组】报数题解
【题目描述】
报数游戏是一个广为流传的休闲小游戏。参加游戏的每个人要按一定顺序轮流报数,但如果下一个报的数是 7 的倍数,或十进制表示中含有数字 7 ,就必须跳过这个数,否则就输掉了游戏。
在一个风和日丽的下午,刚刚结束 SP C20nn 比赛的小 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 × 2 ,35 = 7 × 5 都不能报,小 z 下一个需要报出 36 ;如果小 r 报出了 69 ,由于 70 ∼ 79 的数都含有 7 ,小 z 下一个需要报出 80 才行。
现在小 r 的上一个数报出了 x ,小 z 想快速算出他下一个数要报多少,不过他很快就发现这个游戏可比原版的游戏难算多了,于是他需要你的帮助。当然,如果小 r 报出的 x 本身是不能报出的,你也要快速反应过来小 r 输了才行。
由于小 r 和小 z 玩了很长时间游戏,你也需要回答小 z 的很多个问题。
【输入】
第 1 行,一个正整数 T 表示小 z 询问的数量。
接下来 T 行,每行 1 个正整数 x ,表示这一次小 r 报出的数。
【输出】
共 T 行,每行一个整数,如果小 r 这一次报出的数是不能报出的,输出 −1 ,否则输出小 z 下一次报出的数是多少。
【输入样例】
4 6 33 69 300
【输出样例】
8 36 80 ‐1
这个问题应该是几个题里面唯一一个能让普及组的也做一下的问题。
题目就是说你写一个sv函数初始化一下记录表,然后在表里查询一下输出答案。这个基本就是素数筛的情况,只是判定的时候有所不同:
bool Sv(int k){while(k){if(k%10==7)return true;k/=10;}return false;
}
void Init(){for(int i=1;i<=MXX;i++){if(!table[i]&&Sv(i)){for(int j=1;i*j<=MXX;j++){table[i*j]=true;}}}
}
函数的意思就是对没检测过的进行检测,形式和素数筛一样,但MXX是不能开根号的,因为它不是一个简单的乘法,无法正确处理100007(随便打的,假定它是个素数)这样的情况。其中table即是结果,又起到了加速作用:
#include<iostream>
#include<cmath>
using namespace std;
//把每个数的情况放到桶里
const int MXX=1e7+11;
bool table[MXX];bool Sv(int k){while(k){if(k%10==7)return true;k/=10;}return false;
}void Init(){for(int i=1;i<=MXX;i++){if(!table[i]&&Sv(i)){for(int j=1;i*j<=MXX;j++){table[i*j]=true;}}}
}int main(){ios::sync_with_stdio(false);cin.tie(0);int t,x;Init();cin>>t;while(t--){cin>>x;if(table[x]){cout<<"-1\n";}else{x++;while(table[x]){ //这个查找是浪费大量时间的x++;}cout<<x<<"\n";}}return 0;
}
这样的代码10个测试点可以过7个,另外3个是超时的。代码里已经注释出来了,查询太浪费时间了:题目实际上给了非常明确的提示,自己想一想,7,14,17,21,27……70-79,87……当数位变多之后,连续的带7的长度会很长。
怎么能简化这个每次都循环查找的部分呢?标志表我们已经有了,只需要稍微改一下:标志表里记录的是当前这个数的情况,改为指向下一个不是7相关数的情况,这样只需要再次预处理数据,增加一次循环,以后都能直接读了:
#include<iostream>
#include<cmath>
using namespace std;const int MXX=1e7+11;
int table[MXX];bool Sv(int k){while(k){if(k%10==7)return true;k/=10;}return false;
}void Init(){for(int i=1;i<=MXX;i++){if(!table[i]&&Sv(i)){for(int j=1;i*j<=MXX;j++){table[i*j]=true;}}}//变成记录下一个不是7相关的数是几int last=1;for(int i=2;i<=MXX;i++){if(!table[i]){table[last]=i;last=i;}else{table[i]=i;}}
}int main(){ios::sync_with_stdio(false);cin.tie(0);int t,x;Init();cin>>t;while(t--){cin>>x;if(table[x]==x){cout<<"-1\n";}else{cout<<table[x]<<"\n";}}return 0;
}
细节:
10000000后面第一个非7相关的数是10000010
【21NOIP提高组】报数题解相关推荐
- 信息学奥赛一本通 2082:【21NOIP提高组】报数 | 洛谷 P7960 [NOIP2021] 报数
[题目链接] ybt 2082:[21NOIP提高组]报数 洛谷 P7960 [NOIP2021] 报数 [题目考点] 1. 筛法求质数 2. 因数 3. 数字拆分 4. 链表思想 [解题思路] 根据 ...
- #185. [NOIP2016 提高组] 蚯蚓题解
#185. [NOIP2016 提高组] 蚯蚓题解 题目描述 本题中,我们将用符号 ⌊c⌋\lfloor c \rfloor⌊c⌋ 表示对 ccc 向下取整,例如:⌊3.0⌋=⌊3.1⌋=⌊3.9⌋= ...
- 凡人升天传7——NOIP2010 提高组复赛题解
本蒟蒻在考试时最后一道直接报零*__*,悲痛欲绝,因此在这里著下本题解. 可恶的西西弗 虽然题目做的很垃圾,但在写题解中途不得不感叹除了最后一道,其他真是好水题呀!!! --------------- ...
- 信息学奥赛一本通提高组2085:【21NOIP提高组】棋局
[题目描述] 在输了一晚上的麻将之后,小 z 和小 c 卸掉了手机上的所有牌类游戏.不过这怎么可能阻挡得了他们上课颓废的决心呢?现在他们的目光盯在了棋类游戏上,但他们两个除了天天下飞行器以外,几乎所有 ...
- NOIP2012提高组day1题解
1.Vigenère密码 一开始以为是明码反暗码,就直接把密码表预处理,然后测了多好多遍还是没过样例,十分困惑与不解然后就看一了一遍题目(咳, 暗码减去密码取模 这一遍很自信然后爆零了 ...
- 2009NOIP提高组初赛讲解
2009NOIP提高组初赛 题解 – by L_Y_T 想要更好的体验?配合这里来吧 我的题库:https://blog.csdn.net/L_Y_T020321/article/details/83 ...
- [DP]Luogu 2014NOIP提高组 飞扬的小鸟题解
2014NOIP提高组飞扬的小鸟题解 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一 ...
- 第一届『Citric杯』NOIP提高组模拟赛 题解
[官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...
- 【题解】P1979 [NOIP2013 提高组] 华容道(SPFA,BFS,常数优化)
[题解]P1979 [NOIP2013 提高组] 华容道 最近打比赛次次挂..平均每周得被至少一场比赛打击一次(这周好不容易 ABC 打的还行模拟赛又挂--)心烦意乱.写篇题解疏散一下内心的苦闷(雾) ...
最新文章
- go 通道 返回_GCTT 出品 | Go 语言的缓冲通道:提示和技巧
- 【SSM框架系列】SpringMVC基本介绍
- pandas 合并所有列_图解Python表格操作包Pandas
- 郫都区计算机学校,成都郫县好升学的计算机学校有哪些
- 二阶矩阵乘法C语言,c语言矩阵相乘
- Jupyter Notebook代码提示及补齐功能
- linux中权限减少,Linux中权限管理
- 计算机网络第三版周舸答案,计算机网络技术基础第3版周舸第一章节计算机网络基础知识课件教学.ppt...
- Redhat=》中文
- spring boot项目搭建 连接数据库完成项目基础架构布局
- wps转html乱码,wps换电脑乱码怎么办
- 区块链开发基础知识学习
- Pycharm---修改背景颜色和背景图片
- 7.3 使用“设计视图”创建报表
- R语言实现并行计算[parallel,Rdsm]
- python入门---日常经验分享
- python的numpy教程_ROS与Python入门教程-使用numpy
- 基于EGE的双人象棋
- Python 条件运算符的嵌套来完成此题:学习成绩
- php 获得本机ip,php获取ip_php获取本机ip