【题目描述】

报数游戏是一个广为流传的休闲小游戏。参加游戏的每个人要按一定顺序轮流报数,但如果下一个报的数是 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提高组】报数题解相关推荐

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

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

  2. #185. [NOIP2016 提高组] 蚯蚓题解

    #185. [NOIP2016 提高组] 蚯蚓题解 题目描述 本题中,我们将用符号 ⌊c⌋\lfloor c \rfloor⌊c⌋ 表示对 ccc 向下取整,例如:⌊3.0⌋=⌊3.1⌋=⌊3.9⌋= ...

  3. 凡人升天传7——NOIP2010 提高组复赛题解

    本蒟蒻在考试时最后一道直接报零*__*,悲痛欲绝,因此在这里著下本题解. 可恶的西西弗 虽然题目做的很垃圾,但在写题解中途不得不感叹除了最后一道,其他真是好水题呀!!! --------------- ...

  4. 信息学奥赛一本通提高组2085:【21NOIP提高组】棋局

    [题目描述] 在输了一晚上的麻将之后,小 z 和小 c 卸掉了手机上的所有牌类游戏.不过这怎么可能阻挡得了他们上课颓废的决心呢?现在他们的目光盯在了棋类游戏上,但他们两个除了天天下飞行器以外,几乎所有 ...

  5. NOIP2012提高组day1题解

    1.Vigenère密码   一开始以为是明码反暗码,就直接把密码表预处理,然后测了多好多遍还是没过样例,十分困惑与不解然后就看一了一遍题目(咳,   暗码减去密码取模   这一遍很自信然后爆零了   ...

  6. 2009NOIP提高组初赛讲解

    2009NOIP提高组初赛 题解 – by L_Y_T 想要更好的体验?配合这里来吧 我的题库:https://blog.csdn.net/L_Y_T020321/article/details/83 ...

  7. [DP]Luogu 2014NOIP提高组 飞扬的小鸟题解

    2014NOIP提高组飞扬的小鸟题解 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一 ...

  8. 第一届『Citric杯』NOIP提高组模拟赛 题解

    [官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...

  9. 【题解】P1979 [NOIP2013 提高组] 华容道(SPFA,BFS,常数优化)

    [题解]P1979 [NOIP2013 提高组] 华容道 最近打比赛次次挂..平均每周得被至少一场比赛打击一次(这周好不容易 ABC 打的还行模拟赛又挂--)心烦意乱.写篇题解疏散一下内心的苦闷(雾) ...

最新文章

  1. go 通道 返回_GCTT 出品 | Go 语言的缓冲通道:提示和技巧
  2. 【SSM框架系列】SpringMVC基本介绍
  3. pandas 合并所有列_图解Python表格操作包Pandas
  4. 郫都区计算机学校,成都郫县好升学的计算机学校有哪些
  5. 二阶矩阵乘法C语言,c语言矩阵相乘
  6. Jupyter Notebook代码提示及补齐功能
  7. linux中权限减少,Linux中权限管理
  8. 计算机网络第三版周舸答案,计算机网络技术基础第3版周舸第一章节计算机网络基础知识课件教学.ppt...
  9. Redhat=》中文
  10. spring boot项目搭建 连接数据库完成项目基础架构布局
  11. wps转html乱码,wps换电脑乱码怎么办
  12. 区块链开发基础知识学习
  13. Pycharm---修改背景颜色和背景图片
  14. 7.3 使用“设计视图”创建报表
  15. R语言实现并行计算[parallel,Rdsm]
  16. python入门---日常经验分享
  17. python的numpy教程_ROS与Python入门教程-使用numpy
  18. 基于EGE的双人象棋
  19. Python 条件运算符的嵌套来完成此题:学习成绩
  20. php 获得本机ip,php获取ip_php获取本机ip

热门文章

  1. App平台频频露脸综艺节目 观众到底买账吗?
  2. 遥感卫星不同光谱带介绍(Band 1 - Band 13)
  3. C# NModbus4 TCP 主从站通信样例
  4. 笔记本电脑网络服务无法使用,打开网络共享中心,一直卡在打开界面或者插入网线后右下角为红叉
  5. vmbox让鼠标离开虚拟机
  6. 判断某整数是正整数、负整数还是零
  7. html纵向排列图片,ppt版式垂直排列标题与文本
  8. 苹果IOS企业开发者账号怎么申请——苹果账号申请记录(未完待续)
  9. 移位寄存器——数电第六章学习
  10. C语言之动态内存开辟之malloc