#P13787. [NOIP2021] 报数

news2024/9/25 1:19:09

目录

一,题目

二,题意分析

三,做法

1.直接模拟题意

  2,用筛法来解

3,正解(加上记忆化)


一,题目


二,题意分析

题目意思是说:每次输入一个数,然后先判断这个数是否为某一个十进制中包含7的数的倍数,如果是则输出-1,否则找到该数后的第一个不为任何一个十进制中包含7的数的倍数的数,输出即可。


三,做法


1.直接模拟题意

首先我们程序中必须用一个函数p计算出x的十进制是否中包含7(包含就返回0,否则返回1)

bool p(int x)
{
  while(x)
  {
    if(x % 10 == 7) return 0;
    x /= 10;
  }
  return 1;
}

然后还要一个函数f计算出x是否为某一个十进制中包含7的数的倍数(是就返回0,否则返回1)

bool f(int x)
{
  for(int i = 1; i <= x / i; i++)
    if(x % i == 0 && (p(i) == 0 || p(x / i) == 0))
//其实也就是枚举x的约数,看看约数中有没有十进制中包含7的数
      return 0;
  return 1;
}

然后就是主函数。每次输入x,然后判断f(x)是否等于0(判断对方报的数报对了没),是则输出-1(对方没报对),否则从x + 1开始枚举i(枚举你的要报的数),每次都要判断f(i)是否等于1(判断i是否可以报出来),等于1则输出i(可以报),break,否则i继续++

signed main()
{
  scanf("%lld",&t);
  while(t--)
  {
    scanf("%lld",&x);
    if(f(x) == 0) printf("-1\n");
    else
    {
      int i = x + 1;
      while(1)
      {
        if(f(i) == 1)
        {
          printf("%lld\n",i);
          break;
        }
        i++;
      }
    }
  }
  return 0;
}

总体程序:

#include <bits/stdc++.h>
using namespace std;
#define int long long
int t,x,l[10000001];
bool p(int x)
{
  while(x)
  {
    if(x % 10 == 7) return 0;
    x /= 10;
  }
  return 1;
}
bool f(int x)
{
  for(int i = 1; i <= x / i; i++)
    if(x % i == 0 && (p(i) == 0 || p(x / i) == 0))
      return 0;
  return 1;
}
signed main()
{
  scanf("%lld",&t);
  while(t--)
  {
    scanf("%lld",&x);
    if(f(x) == 0) printf("-1\n");
    else
    {
      int i = x + 1;
      while(1)
      {
        if(f(i) == 1)
        {
          printf("%lld\n",i);
          break;
        }
        i++;
      }
    }
  }
  return 0;
}


  2,用筛法来解

 我们可以发现,这道题和埃氏筛法的思想很像,其实就是模拟,我们可以用一个vis数组来记录一个数是否应该被跳过。

初始化vis的代码:

void fin()
{
  for(int i = 1; i < 10000001; i++)
    if(vis[i] == 0 && p(i) == 1)
      for(int j = 1; i * j < 10000011; j++)
        vis[i * j] = 1;
}


这样我们就预处理好了10^7以内的数是否应该被跳过

于是乎,我又交了一发这样的代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
int t,x,vis[10000011];
bool p(int x)
{
  while(x)
  {
    if(x % 10 == 7) return 1;
    x /= 10;
  }
  return 0;
}
void fin()
{
  for(int i = 1; i < 10000001; i++)
    if(vis[i] == 0 && p(i) == 1)
      for(int j = 1; i * j < 10000011; j++)
        vis[i * j] = 1;
}
signed main()
{
  fin();
  scanf("%lld",&t);
  while(t--)
  {
    scanf("%lld",&x);
    if(x < 0)
    {
      printf("1");
      continue;
	}
    if(vis[x] == 1) printf("-1\n");
    else
    {
      for(int i = x + 1;i;i++)
      {
        if(vis[i] == 0)
        {
          printf("%lld\n",i);
          break;
        }
      }
    }
  }
  return 0;
}

你以为这样就结束了吗?

非也,非也。

 我又荣幸地拿到了70分,T了三个点。


3,正解(加上记忆化)

我看了看样例,突然发现样例中多次询问了同一个数,就用l数组来记录已经询问过的数,并在每次询问时都判断一下l[x]是否为0,不为0则直接输出l[x],否则进行计算,最后再把结果记录到l[x]中。

没想到真的AC了。。。

AC代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
int t,x,l[10000011],vis[10000011];
bool p(int x)
{
  while(x)
  {
    if(x % 10 == 7) return 1;
    x /= 10;
  }
  return 0;
}
void fin()
{
  for(int i = 1; i < 10000001; i++)
    if(vis[i] == 0 && p(i) == 1)
      for(int j = 1; i * j < 10000011; j++)
        vis[i * j] = 1;
}
signed main()
{
  fin();
  scanf("%lld",&t);
  while(t--)
  {
    scanf("%lld",&x);
    if(x < 0)
    {
      printf("1");
      continue;
	}
    if(l[x] != 0)
    {
      printf("%lld\n",l[x]);
      continue;
    }
    if(vis[x] == 1) printf("-1\n");
    else
    {
      for(int i = x + 1;i;i++)
      {
        if(vis[i] == 0)
        {
          l[x] = i;
          printf("%lld\n",i);
          break;
        }
      }
    }
  }
  return 0;
}

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

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

相关文章

Redis 为什么这么快?

1.基于内存实现 Redis 是基于内存的数据库&#xff0c;跟磁盘数据库相比&#xff0c;完全吊打磁盘的速度。 2.高效的数据结构 Redis 一共有 5 种数据类型&#xff0c;String、List、Hash、Set、SortedSet。 不同的数据类型底层使用了一种或者多种数据结构来支撑&#xff0c;目的…

如何选择适合自己的进销存系统软件?

选择一款合适的进销存软件&#xff0c;可以有效解决企业生产经营中业务管理、分销管理、存货管理、营销计划的执行和监控、统计信息的收集等方面的业务问题。 进销存软件一直是一个热门话题&#xff0c;别急&#xff0c;我这就来给你介绍。 一、进销存管理软件 这里我要推荐…

计算机系统概述

计算机系统概述一、操作系统的概念1、定义2、功能和目标二 、操作系统特征1、并发性2、共享性3、虚拟性4、异步性三、操作系统的发展1、手工操作阶段2、批处理阶段——单道批处理系统2、批处理阶段——多道批处理系统3、实时操作系统四、运行机制和体系结构1、运行机制①指令②…

Gitea 的邮件通知

有这样的一个需求&#xff0c;当仓库中被推送或者更新代码的时候&#xff0c;希望在邮件中收到邮件通知。 Gitea 是可以实现这个功能的&#xff0c;但是在默认情况下这个功能是关闭的。 修改配置文件 根据 Gitea 的安装不同&#xff0c;我们的配置文件在&#xff1a;vi /etc…

【正点原子FPGA连载】第六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第六章Petalinux…

【CS硕士三年级BetterBench】2022年终总结(脚踏实地,仰望星空)

2022年终总结 回忆录 2022年焦虑和快乐是这一年中最大的两种情绪了。焦虑主要是因为心里的三块石头&#xff0c;从年初就开始悬着。第一块石头&#xff0c;科研论文录用&#xff0c;第二个石头&#xff0c;拿到国奖&#xff0c;第三个石头是拿到满意的offer。目前只剩下最后一…

【Linux】多文件编译

目录 多文件编译 为什么要分两步编译&#xff1a; makefile文件 makefile里面安装 更改可调式版本 对比Windows中的VS 多文件编译 有以下文件 分两步&#xff1a; 第一步编译&#xff1a;.c->.o 第二步链接&#xff08;可以不用写头文件&#xff09;&#xff1a;.o-…

《图解TCP/IP》阅读笔记(第九章)—— 网络安全相关

第九章 网络安全 本章旨在介绍互联网中网络安全的重要性及其相关的实现技术。 本章的内容在我看来&#xff0c;并没有前几章那么重要&#xff0c;大概有所了解就好。 9.1 TCP/IP与网络安全 起初&#xff0c;TCP/IP只用于一个相对封闭的环境&#xff0c;后来才发展为并无太多…

Python编程 匿名函数,高阶函数

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.匿名函数 1.匿名函数介绍 匿名函数应用 匿名函数作返回值 匿名函数作…

【数据结构】超详细!从HashMap到ConcurrentMap,我是如何一步步实现线程安全的!

什么是HashMap&#xff1f; 在了解 HashMap 之前先了解一下什么是 Map&#xff1b; 什么是Map&#xff1f; 定义 Map 是一个用于存储 Key-Value 键值对的集合类&#xff0c;也就是一组键值对的映射&#xff0c;在 Java 中 Map 是一个接口&#xff0c;是和 Collection 接口同…

注解@Resource,注解@Qualifier

1.在进⾏类注⼊时&#xff0c;除了可以使⽤ Autowired 关键字之外&#xff0c;我们还可以使⽤ Resource 进⾏注⼊&#xff0c;如下代码所示&#xff1a; 运行结果&#xff1a; Autowired 和 Resource 的区别 出身不同&#xff1a;Autowired 来⾃于 Spring&#xff0c;⽽ Reso…

拾遗增补(二)——线程组

目录1.线程关联线程组&#xff1a;1级关联2.线程对象关联线程组&#xff1a;多级关联3.线程组自动归属特性4.获取根线程组5.线程组里加线程组6.组内的线程的批量停止7.递归与非递归取得组内对象可以把线程归属到某一个线程组中&#xff0c;线程组中可以有线程对象&#xff0c;也…

58.Python的递归函数

58.Python的递归函数 文章目录58.Python的递归函数1.递归的形象解释2.定义3.步骤4.终止条件5.优点6.缺点7.调用深度8.课堂实例9.计算n的阶乘9.1什么是阶乘9.2计算5&#xff01;1.递归的形象解释 我们首先看一段视频&#xff0c;来形象理解什么是递归。 视频作者&#xff1a;p…

完整的OpenDDS的发布订阅编写及源码(Windows)

一个完整的OpenDDS的发布订阅编写及源码,包括SimuMsg.idl、SimuMsg.mwc和SimuMsg.mpc,SimuMsgCommon_Export.h、publisher.cpp、subscriber.cpp、SimuMsgDataReaderListenerImpl.h和SimuMsgDataReaderListenerImpl.cpp、SimuMsgDataWriterListenerImpl.h和SimuMsgDataWriterL…

还有企业没有在用它嘛! 适配于多行业的管理系统,各企业之首选

在信息技术高速发展的现代社会&#xff0c;世界经济一体化和企业经营全球化已成为大势所趋。在此背景下&#xff0c;企业为增强自身的竞争力&#xff0c;就要强化管理&#xff0c;规范业务流程&#xff0c;提高透明度&#xff0c;加快商品资金周转&#xff0c;以及为流通领域信…

使用MariaDB线程池提高MySQL的扩展性

摘要&#xff1a;MySQL的线程池能够有效地解决大量短连接的性能问题&#xff0c;大幅提高MySQL数据库的扩展性。但官方MySQL的线程池在收费的企业版中才有&#xff0c;免费的社区版中没有这个功能&#xff0c;这里介绍MairaDB的线程池。 关于作者&#xff0c;姚远&#xff1a;…

不用梯子,GitHub也能访问并提速

引言 我们都知道国内访问github会非常慢&#xff0c;甚至打不开&#xff0c;具体原因这里就不聊了~我们这里聊怎么不用梯子&#xff0c;GitHub也能访问并提速&#xff01; Github打开慢的原因 Github打开慢的原因其中一个原因&#xff1a;GitHub的CDN域名遭到DNS污染&#xf…

好用的开源个人博客推荐

原文网址&#xff1a;好用的开源个人博客推荐_IT利刃出鞘的博客-CSDN博客 简介 本文推荐个人从几十款开源个人博客中精选的几款开源博客。 halo Github 地址 &#xff1a;https://github.com/halo-dev/halo Star : 24.3k 简介 &#xff1a;一个优秀的开源博客应用。 技术 …

java学习day66(乐友商城)搜索过滤

1.过滤功能分析 首先看下页面要实现的效果&#xff1a; 整个过滤部分有3块&#xff1a; 顶部的导航&#xff0c;已经选择的过滤条件展示&#xff1a; 商品分类面包屑&#xff0c;根据用户选择的商品分类变化 其它已选择过滤参数 过滤条件展示&#xff0c;又包含3部分 商品分…

CNN神经网络

CNN神经网络0.引言0.1.卷积0.2.Relu函数0.3.池化pooling0.4.小节1.前向传播1.1.input layer --> convolution layer1.2.Hidden Layer --> convolution layer1.3.Hidden layer --> pooling layer1.4.Hidden layer --> full connected layer1.5.小节2.反向传播2.1.po…