P7960 [NOIP2021] 报数__洛谷题解

news/2025/11/21 22:06:29/文章来源:https://www.cnblogs.com/thirtyseven/p/19254656

P7960 [NOIP2021] 报数

题目描述

报数游戏是一个广为流传的休闲小游戏。参加游戏的每个人要按一定顺序轮流报数,但如果下一个报的数是 \(7\) 的倍数,或十进制表示中含有数字 \(7\),就必须跳过这个数,否则就输掉了游戏。

在一个风和日丽的下午,刚刚结束 SPC20nn 比赛的小 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 \times 2\)\(35 = 7 \times 5\) 都不能报,小 z 下一个需要报出 \(36\) ;如果小 r 报出了 \(69\),由于 \(70 \sim 79\) 的数都含有 \(7\),小 z 下一个需要报出 \(80\) 才行。

现在小 r 的上一个数报出了 \(x\),小 z 想快速算出他下一个数要报多少,不过他很快就发现这个游戏可比原版的游戏难算多了,于是他需要你的帮助。当然,如果小 r 报出的 x 本身是不能报出的,你也要快速反应过来小 r 输了才行。

由于小 r 和小 z 玩了很长时间游戏,你也需要回答小 z 的很多个问题。

输入格式

第一行,一个正整数 \(T\) 表示小 z 询问的数量。

接下来 \(T\) 行,每行一个正整数 \(x\),表示这一次小 r 报出的数。

输出格式

输出共 \(T\) 行,每行一个整数,如果小 r 这一次报出的数是不能报出的,输出 \(-1\),否则输出小 z 下一次报出的数是多少。

输入输出样例 #1

输入 #1

4
6
33
69
300

输出 #1

8
36
80
-1

输入输出样例 #2

输入 #2

5
90
99
106
114
169

输出 #2

92
100
109
-1
180

输入输出样例 #3

输入 #3

见附件中的 number/number3.in

输出 #3

见附件中的 number/number3.ans

输入输出样例 #4

输入 #4

见附件中的 number/number4.in

输出 #4

见附件中的 number/number4.ans

说明/提示

【样例解释 #1】

这一组样例的前 \(3\) 次询问在题目描述中已有解释。

对于第 \(4\) 次询问,由于 \(300 = 75 \times 4\),而 \(75\) 中含有 \(7\) ,所以小 r 直接输掉了游戏。

【数据范围】

对于 \(10\%\) 的数据,\(T \leq 10\)\(x \leq 100\)
对于 \(30\%\) 的数据,\(T \leq 100\)\(x \leq 1000\)
对于 \(50\%\) 的数据,\(T \leq 1000\)\(x \leq 10000\)
对于 \(70\%\) 的数据,\(T \leq 10000\)\(x \leq 2 \times {10}^5\)
对于 \(100\%\) 的数据,\(1 \le T \leq 2 \times {10}^5\)\(1 \le x \leq {10}^7\)

思路

注意到数据范围不是很大,一个一个往后枚举去搜可能会爆时间,因此选择提前处理,后面直接用已经处理过的数组代入快速筛;
筛法具题意很好想出:

  • 对于是7的倍数的数直接筛就行了。
  • 对于含7的十进制数及其倍数则进行以下处理:
    注意到7可以方便的枚举出在每个位数的情况:\(t=7\) 所在的位数;即\(0\le j \leq 10^{t-1}-1\)\(7*10^{t}+j\) 即可表示所有在该位含7的基数。
    则所有在含该位下的7的所有数,只需要枚举7以前的所有数即可,故只需要依次递增\(10^{t}\)即可。
    接下来对于每个找到的数再倍速枚举即筛掉了所有不能说的数。

然而这还不够,明显在面对每个问题一个个向后去找有很多重复的无用步骤,所以:

  • 我们可以仍然进行预处理,建立数组 \(a\) ,\(a_i\)表示对于第\(i\)个数它之后能说的下一个数为\(a_i\)
  • 接下来顺序枚举所有数,当遇到没有被标记为不能说的数的数\(i\),直接将之前所有未赋值的\(a_j\)全部赋值为当前找的\(i\),这样提前预处理完,在后面的找的过程中就可以直接\(O(1)\)解决,省去了重复查找的过程。

code

  • 代码如下
#include<bits/stdc++.h>
using namespace std;
int t;
bool b[15000000];
int a[15000000];
int p(int x)        //求10的x次方
{int y=1;for(int i=1;i<=x;i++){y*=10;}return y;
}
int main()
{for(int i=1;i*7<=10005000;i++){b[i*7]=1;                    //筛去7的倍数}for(int i=1;i<=7;i++){ int con=p(i-1);int co=con*10;for(int k=0;k*co+7*con+con-1<=10005000;k++){for(int j=0;j<=con-1;j++)            // 三层循环找7在位上的所有数{int num=k*co+7*con+j;b[num]=1;int w=2;while(w*num<=10005000){if(!b[w*num])            //倍数枚举筛去所有倍数b[w*num]=1;w++;}}}}int mao=0;for(int j=1;j<=10005000;j++)                //预处理找下一个能说的数标记{if(!b[j]){for(int i=mao;i<j;i++)a[i]=j;mao=j;}}cin>>t;for(int i=1;i<=t;i++){int x;cin>>x;if(b[x])cout<<"-1"<<endl;            //如果已经是不能说的数else{cout<<a[x]<<endl;          //否则直接输出先前已经找过的ax}}return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/972580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

The 5W2H Problem-Solving Method

The 5W2H Problem-Solving Method https://www.msicertified.com/wp-content/uploads/2024/02/The-5W2H-Problem-Solving-Method.pdf 出处:http://www.cnblogs.com/lightsong/本文版权归作者和博客园共有,欢迎转载,但…

题解:SP5830 ALTPERM - Alternating Permutations

题意:给你 \(K\) 个下标,保证 \(A_1=1,A_K=N\),且对任意的 \(i<N\) 有 \(A_i<A_{i+1}\)。 如果一个排列,在下标 \(A_1\) 到 \(A_2\) 处单调递增,在下标 \(A_2\) 到 \(A_3\) 处单调递减,在下标 \(A_3\) 到 …

图床创建:github+Picgo+obsidian 带有同步删除的自动上传

最近一直在做DL部分的学习笔记,一个比较麻烦的地方就是我一直用的obsidian做笔记内容,在博客园导入随笔后,图片的链接一直是我的本地路径,自然无法显示,于是我只好在导入随笔后再把图片一张张上传到博客园的图床上…

重组生长因子全面解析:从结构功能到科研应用指南

重组生长因子是现代生命科学研究中不可或缺的重要工具,它们通过基因工程技术在体外表达和纯化获得,为细胞生物学、发育生物学及信号转导研究提供了高纯度、高活性的关键试剂。作为科研试剂,重组生长因子以其精确的序…

2055.11.21

十点睡醒起床,吃饭 然后洗澡回宿舍上网课,开团会,出去吃饭,回宿舍准备睡觉

Dify异步接口调用优化实践:解决长时任务处理与网络超时疑问

Dify异步接口调用优化实践:解决长时任务处理与网络超时疑问pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

STM32系统时钟与SysTick定时器

一、系统嘀嗒定时器(SysTick)全面解析 1. SysTick定时器基本概念 定时器是STM32 中常用的外设,一般定时器的基本功能就是定时,而在Cortex M3/M4 内核中也包含一个简单的定时器,就是系统嘀嗒定时器(Systick),它是属…

【251121】CF2171 Div.3 vp 总结

老师说让我尝试体验快乐 AK,但是我失败了。 还是太菜了喵! 题目梗概题目编号 题目名称 题目链接A Shizuku Hoshikawa and Farm Legs LinkB Yuu Koito and Minimum Absolute Sum LinkC1 / C2 Renako Amaori and XOR G…

OI 笑传 #32

なんてったって春今天是 bct Day2,赛时 \(40+60+10+0=110\),rk 70。 挂分原因是被 vector 卡常了/fn。然后 T4 捆绑 Sbt#1 T 了一个于是又没了 20pts。 评价是 ok 场,练习了对拍的使用。 发现 hm2ns 总是会随口否掉…

PyOpenGL实现Bresenham算法

Bresenham直线算法 Bresenham画圆算法 中点Bresenham画椭圆算法1. Bresenham直线生成算法 1.1 理论基础 绘制直线的最直观想法是使用直线方程 y = mx + b,并对x的每个整数值计算y 这涉及到大量的浮点数乘法和舍入运算…

【Linux】教你在 Linux 上搭建 Web 服务器,步骤清晰无门槛 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【第7章 I/O编程与异常】\r\n 和 \n\r是一回事吗?

\r\n 和 \n\r 不是一回事,它们是两种完全不同的字节序列,在语义和实际效果上也完全不同。 一、含义对比 序列 字节(十六进制) 含义\r\n 0x0D 0x0A 回车(Carriage Return) + 换行(Line Feed)✅ Windows 标准换行…

2025-11-21

CF Problem - 1234C - Codeforces(贪心) #include <bits/stdc++.h> using namespace std; #define LL long long const LL mod = 998244353; const int N=2e5+10; string s[2];void solve() {int n;cin >&g…

深入解析:windows显示驱动开发-CCD api的摘要及方案(一)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

nju实验七 状态机及键盘输入

本实验的目的是学习状态机的工作原理,了解状态机的编码方式,并利用PS/2键盘输入实现简单状态机的设计。实验七 状态机及键盘输入 简单状态机 . ├── build ├── constr │ └── top.nxdc ├── csrc │ └…

2025-11-21 XQQ NOIP Round 1 hetao1733837的record

2025-11-21 XQQ NOIP Round 1 hetao1733837的record2025-11-21 XQQ NOIP Round 1 hetao1733837的record A.tree 提交链接:树 题面 题目描述 给定一棵 $n$ 个点的树和一个长度为 $n$ 的数组 $score[0], ..., score[n-1…

Gephi如何支持MySQL数据的复杂查询

Gephi是一个用于网络可视化的开源软件,它主要处理的是图数据结构。虽然Gephi本身并不直接支持MySQL数据库的复杂查询,但你可以通过以下步骤将MySQL中的数据导入到Gephi中,并在Gephi中进行进一步的处理和分析:数据提…

Mozilla CI日志中暴露微软x-apikey的安全事件分析

微软遥测API密钥在Mozilla持续集成公共日志中意外暴露。该密钥出现在自动化Firefox测试期间发送到微软遥测端点的HTTP POST请求中,通过mitmproxy日志捕获。尽管安全影响有限,但Mozilla已采取措施防止未来凭证泄露。报…

Gephi中MySQL数据的节点和边如何设置

在Gephi中,使用MySQL数据源时,首先需要导入数据到Gephi的工作空间。以下是设置节点(Node)和边(Edge)的一般步骤:导入MySQL数据:使用Gephi的MySQL插件或其他适当的方法连接到您的MySQL数据库。 执行SQL查询以提…