【题目描述】

报数游戏是一个广为流传的休闲小游戏。参加游戏的每个人要按一定顺序轮流报数,但如果下一个报的数是 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. ELK/EFK — Overview
  2. 三种常见中文内码的转换方法
  3. 初级PHP开发作品容易出现的几个不足
  4. 初使用swagger遇到的问题(1)
  5. 微信小程序 - 更改radio和checkbox选中样式
  6. EtherCAT(扒自百度百科)
  7. crud-table_我个人的CRUD故事-或我如何来到CUBA平台
  8. SpringBoot原理-SpringBoot核心运行原理
  9. 微信发虎年新春贺词领福袋:游戏皮肤、QQ音乐VIP、现金红包等
  10. ipad远程连接虚拟机linux,如何从ipad pro上通过SSH远程Linux
  11. 一个自动上传ip到ftp服务器的bat脚本
  12. vue.js+koa2项目实战(四)搭建koa2服务端
  13. android 检测sqlite数据表中字段(列)是否存在
  14. 最新的Jetson TX2刷机细节,以及一些问题(device not managed:选择network layout时的第二种后wifi消失的问题)
  15. 【连载】第五章机械振动第一节——简谐振动
  16. 关于吾爱(52)破解网注册时临时安全验证码以及填完信息没有确认或提交按钮的问题
  17. 学妹问我: 如何提高编程能力
  18. 51单片机+PCF8591的多波形发生器仿真程序(正弦波 三角波等可调)
  19. jar包过大?手把手教你分析Maven依赖,完美“瘦身”优化!
  20. java基础知识之加强

热门文章

  1. IO多路复用底层原理及源码解析
  2. win2016开启ntp_WinServer 2016域控设置NTP服务器
  3. 通过亚马逊云科技实现基于 Restful API 的 CloudFront Distribution 复制/克隆功能
  4. SpringBoot企业微信点餐系统
  5. hive sql系列(二)——统计每个人每个月访问量和累计月访问量
  6. 微信小程序退款功能(详解完整)
  7. 重学JavaSE —— Map、Set、Iterator(迭代器) 简单笔记
  8. 【MAC】有道笔记登陆不了,刷新不出登陆
  9. 咸鱼Maya笔记—Maya 热键
  10. 欢迎使用CS方分分分n编辑器