P1010 [NOIP1998 普及组] 幂次方 Python题解

[NOIP1998 普及组] 幂次方

题目描述

任何一个正整数都可以用 2 2 2 的幂次方表示。例如 137 = 2 7 + 2 3 + 2 0 137=2^7 + 2^3 + 2^0 137=27+23+20

同时约定次方用括号来表示,即 a b a^b ab 可表示为 a ( b ) a(b) a(b)

由此可知, 137 137 137 可表示为 2 ( 7 ) + 2 ( 3 ) + 2 ( 0 ) 2(7)+2(3)+2(0) 2(7)+2(3)+2(0)

进一步:

7 = 2 2 + 2 + 2 0 7= 2^2+2+2^0 7=22+2+20 ( 2 1 2^1 21 2 2 2 表示),并且 3 = 2 + 2 0 3=2+2^0 3=2+20

所以最后 137 137 137 可表示为 2 ( 2 ( 2 ) + 2 + 2 ( 0 ) ) + 2 ( 2 + 2 ( 0 ) ) + 2 ( 0 ) 2(2(2)+2+2(0))+2(2+2(0))+2(0) 2(2(2)+2+2(0))+2(2+2(0))+2(0)

又如 1315 = 2 10 + 2 8 + 2 5 + 2 + 1 1315=2^{10} +2^8 +2^5 +2+1 1315=210+28+25+2+1

所以 1315 1315 1315 最后可表示为 2 ( 2 ( 2 + 2 ( 0 ) ) + 2 ) + 2 ( 2 ( 2 + 2 ( 0 ) ) ) + 2 ( 2 ( 2 ) + 2 ( 0 ) ) + 2 + 2 ( 0 ) 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入格式

一行一个正整数 n n n

输出格式

符合约定的 n n n 0 , 2 0, 2 0,2 表示(在表示中不能有空格)。

样例 #1

样例输入 #1

1315

样例输出 #1

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

提示

【数据范围】

对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 2 × 10 4 1 \le n \le 2 \times {10}^4 1n2×104

NOIP1998 普及组 第三题

题解

这题我怎么看都觉得是记忆化搜索或者动态规划的题,去看题解全是递归?反正对于这道题来说我写不出递归,所以干脆就写dp了。

这题dp思路很简单
137 = 2 7 + 2 3 + 2 0 137 = 2^7 + 2^3 + 2^0 137=27+23+20
其中 7 7 7又可以表示成 7 = 2 2 + 2 + 2 0 7= 2^2+2+2^0 7=22+2+20

这里已经明摆着说我们可以通过动态规划来做这道题,正常思路就是记录由 1 1 1 137 137 137的所有的解了,可能可以这么解,但我不是这么做的,蒟蒻脑子只能想到这,大佬们轻喷。这里我的做法其实是把所有的 2 2 2的次方给记录下来,什么意思?

我们把 2 0 、 2 1 、 2 2 、 2 3 . . . 2^0、2^1、2^2、2^3... 20212223...求出来,然后复原数字即可!

状态转移方程为:
d p [ t a r g e t ] = 2 ( ∑ i = 0 l e n ( b i n ( t a r g e t ) ) d p [ i ] dp[target] = 2(\sum^{len(bin(target))}_{i=0}{dp[i]} dp[target]=2(i=0len(bin(target))dp[i] i f if if b i n ( t a r g e t ) [ i ] = = 1 ) bin(target)[i]==1) bin(target)[i]==1)

看着挺复杂的,其实不复杂, 2 ( ) 2() 2()就是指翻倍,里面的公式指的就是指数对应的值,例如 2 6 = 64 2^6=64 26=64 6 = 2 2 + 2 6=2^2+2 6=22+2,我们需要去找到 d p [ 2 ] dp[2] dp[2] d p [ 1 ] dp[1] dp[1],最后复原 d p [ 6 ] = 2 ( 2 ( 2 ) + 2 ) dp[6] = 2(2(2)+2) dp[6]=2(2(2)+2)

上例就可以这么做,我们求出 d p dp dp(一直求到 d p [ 7 ] dp[7] dp[7]):
[ 2 ( 0 ) , 2 , 2 ( 2 ) , 2 ( 2 + 2 ( 0 ) ) , 2 ( 2 ( 2 ) ) , 2 ( 2 ( 2 ) + 2 ( 0 ) ) , 2 ( 2 ( 2 ) + 2 ) , 2 ( 2 ( 2 ) + 2 + 2 ( 0 ) ) ] [2(0), 2, 2(2),2(2+2(0)), 2(2(2)), 2(2(2)+2(0)), 2(2(2)+2), 2(2(2)+2+2(0))] [2(0),2,2(2),2(2+2(0)),2(2(2)),2(2(2)+2(0)),2(2(2)+2),2(2(2)+2+2(0))]

然后根据二进制为 1 1 1的位置把结果加起来即可
137 = d p [ 7 ] + d p [ 3 ] + d p [ 0 ] = 2 ( 2 ( 2 ) + 2 + 2 ( 0 ) ) + 2 ( 2 + 2 ( 0 ) ) + 2 ( 0 ) 137 = dp[7] + dp[3] + dp[0] = 2(2(2)+2+2(0))+2(2+2(0))+2(0) 137=dp[7]+dp[3]+dp[0]=2(2(2)+2+2(0))+2(2+2(0))+2(0)

这是不是很简单,^ _ ^

上代码:

Num = int(input().strip())
BNum = bin(Num).replace('0b','')
dp = [str() for _ in range(len(BNum))]
dp[0] = "2(0)"
dp[1] = "2"
def calAns(Bj):
    ans = ""
    global dp
    Bj = Bj[::-1]
    for i in range(len(Bj)):
        if Bj[i] == "1":
            ans = f"{dp[i]}+{ans}" if ans != "" else f"{dp[i]}"
    return ans
for j in range(1, len(BNum)):
    if dp[j] == "":
        Bj = bin(j).replace('0b','')
        for i in range(len(Bj)):
            if Bj[i] == "1":
                dp[j] = f"2({calAns(Bj)})"
ans = calAns(BNum)
print(ans)

在这里插入图片描述
因为这道题数据不太行,
数据很小 ( n < = 20000 ) (n<=20000) (n<=20000) 14 < l o g 2 20000 < 15 14<log_{2}20000<15 14<log220000<15
,我们 d p dp dp其实可以不用求,而是直接写死它!哈哈哈,更简单了:

def Solution2():
    Num = int(input().strip())
    BNum = bin(Num).replace('0b', '')
    dp = ["2(0)", "2", "2(2)", "2(2+2(0))", "2(2(2))", "2(2(2)+2(0))", "2(2(2)+2)", "2(2(2)+2+2(0))", "2(2(2+2(0)))",
          "2(2(2+2(0))+2(0))", "2(2(2+2(0))+2)", "2(2(2+2(0))+2+2(0))", "2(2(2+2(0))+2(2))", "2(2(2+2(0))+2(2)+2(0))",
          "2(2(2+2(0))+2(2)+2)"]
    def calAns(Bj):
        ans = ""
        Bj = Bj[::-1]
        for i in range(len(Bj)):
            if Bj[i] == "1":
                ans = f"{dp[i]}+{ans}" if ans != "" else f"{dp[i]}"
        return ans
    print(calAns(BNum))
Solution2()

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为 HCIP-Datacom H12-821 题库 (33)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.VLAN Pool 只要通过一个 SSID 就能够同时支持多个业务 VLAN&#xff0c;从而缩小广播域&#…

draw.io 设置默认字体及添加常用字体

需求描述 draw.io 是一个比较好的开源免费画图软件。但是其添加容器或者文本框时默认的字体是 Helvetica&#xff0c;一般的期刊、会议论文或者学位论文要求的英文字体是 Times New Roman&#xff0c;中文字体是 宋体&#xff0c;所以一般需要在文本字体选项里的下拉列表选择 …

Spring开发最佳实践之跨域处理

1. 跨域处理 1.1 异常现象 1.2 异常原因分析 跨源资源共享的官方定义如下&#xff1a; 跨源资源共享&#xff08;CORS&#xff0c;Cross Origin Resource Sharing。或通俗地译为跨域资源共享&#xff09;是一种基于 HTTP 头的机制&#xff0c;该机制通过允许服务器标示除了它自…

线性代数入门

线性代数入门 线性代数&#xff08;Linear Algebra&#xff09;是数学的重要分支之一&#xff0c;广泛应用于工程、计算机科学、物理学、经济学等领域。它主要研究向量、矩阵及其在空间中的变换。对于程序员来说&#xff0c;掌握线性代数的基础知识能够帮助更好地理解数据处理…

[C++]使用纯opencv部署yolov8-cls图像分类onnx模型

【算法介绍】 使用纯OpenCV部署YOLOv8-cls图像分类ONNX模型涉及几个关键步骤。 首先&#xff0c;你需要将YOLOv8-cls模型从PyTorch格式转换为ONNX格式&#xff0c;这是为了确保模型在不同深度学习框架之间的互操作性。这个转换过程通常是通过ultralytics框架中的model.export…

Linux TFTP服务器搭建

话得多说 先水一波字 TFTP&#xff08;Trivial File Transfer Protocol&#xff09;是一种简单的文件传输协议。它用于在计算机网络中传输文件&#xff0c;特别适用于在网络设备&#xff08;如开发板和Linux系统下&#xff09;代码调试等操作。TFTP使用UDP&#xff08;User Da…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz

SpringBoot教程&#xff08;二十四&#xff09; | SpringBoot实现分布式定时任务之Quartz 简介适用场景Quartz核心概念Quartz 存储方式Quartz 版本类型引入相关依赖开始集成方式一&#xff1a;内存方式(MEMORY)存储实现定时任务1. 定义任务类2. 定义任务描述及创建任务触发器3.…

C语言的柔性数组

目录 柔性数组1.柔性数组的特点&#xff1a;2.柔性数组的使用3.柔性数组的优势 柔性数组 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。 C99 中&#xff0c;结构体中的最后⼀个元素允许是未知⼤⼩的数组&…

程序员日志之DNF手游女鬼剑异界套选择思路

目录 传送门正文日志1、概要2、剑宗3、剑豪4、剑魔5、暗帝 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff09; SpringBoot3框架&#xff08;精品&#xff09; MyBatis框架&#xff08;精品&#xff09; MyBatis-Plus Sp…

STM32 OLED

文章目录 前言一、OLED是什么&#xff1f;二、使用步骤1.复制 OLED.C .H文件1.1 遇到问题 2.统一风格3.主函数引用头文件3.1 oled.h 提供了什么函数 4.介绍显示一个字符的函数5. 显示十进制函数的讲解 三、使用注意事项3.1 配置符合自己的引脚3.2 花屏总结 前言 提示&#xff…

Elasticsearch要点简记

Elasticsearch要点简记 1、ES概述2、基础概念&#xff08;1&#xff09;索引、文档、字段&#xff08;2&#xff09;映射&#xff08;3&#xff09;DSL 3、架构原理4、索引字段的数据类型5、ES的三种分页方式&#xff08;1&#xff09;深度分页&#xff08;fromsize&#xff09…

ndb9300public-ndb2excel简介

1 引言 ndb9300是一个自己定义的机载导航数据库劳作&#xff08;不敢称为项目&#xff09;代号&#xff0c;其中3表示是第3种数据库。 多年前&#xff0c;对在役民航客机中的某型机载导航数据库的二进制文件进行分析&#xff0c;弄明白它的数据结构后做了几个工具&#xff0c…

【Flutter】- 核心语法

文章目录 知识回顾前言源码分析1. 有状态组件2. 无状态组件3. 组件生命周期4. 常用组件Container组件Text组件Image组件布局组件row colum stack expandedElevntButton按钮拓展知识总结知识回顾 【Flutter】- 基础语法 前言 Flutter是以组件化的思想构建客户端页面的,类似于…

算法与程序课程设计——观光铁路

观光铁路 一、任务 跳蚤国正在大力发展旅游业&#xff0c;每个城市都被打造成了旅游景点。 许多跳蚤想去其他城市旅游&#xff0c;但是由于跳得比较慢&#xff0c;它们的愿望难以实现。这时&#xff0c;小C听说有一种叫做火车的交通工具&#xff0c;在铁路上跑得很快&#x…

Kubernetes proxy 命令与集群资源交互中起的作用

关于 Kubernetes 中的 kubectl proxy 命令&#xff0c;理解它的作用有助于更深入地掌握 Kubernetes 如何管理集群内的资源&#xff0c;以及开发和调试时如何通过代理来简化交互。kubectl proxy 提供了一种安全且方便的方式来访问 Kubernetes API 服务器&#xff0c;尤其是在调试…

今日指数day8实战补充(上)

1.用户管理 1.多条件综合查询 1.1 多条件综合查询接口说明 1&#xff09;原型效果 2&#xff09;接口说明 功能描述&#xff1a;多条件综合查询用户分页信息&#xff0c;条件包含&#xff1a;分页信息 用户创建日期范围 服务路径&#xff1a;/api/users 服务方法&#xff1…

用Manim简单解释奇异值分解(SVD)和图像处理方面的应

一&#xff0c;介绍 奇异值分解&#xff08;SVD&#xff09;是一种重要的矩阵分解技术&#xff0c;在统计学、信号处理和机器学习等领域有广泛应用。对于任意给定的矩阵 A&#xff08;可以是任意形状的矩阵&#xff09;&#xff0c;SVD将其分解为三个特定的矩阵的乘积&#x…

idea2024设置中文

今天下载idea2024.2版本&#xff0c;发现已经装过中文插件&#xff0c;但是还是不显示中文&#xff0c;找了半天原来还需要设置中文选项 方案一 点击文件 -> 关闭项目 点击自定义 -> 选择语言 方案二 点击文件 -> 设置 外观与行为 -> 系统设置 -> 语言和地区…

LSTM时序预测 | Python实现LSTM长短期记忆神经网络时间序列预测

本文内容&#xff1a;Python实现LSTM长短期记忆神经网络时间序列预测&#xff0c;使用的数据集为AirPassengers 目录 数据集简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 数据集简介 AirPassengers 数据集的来源可以追溯到经典的统计和时间序列分析文献。原始数据集由 Box,…

增强分析:新时代的数据洞察工具

随着数据科学和人工智能的迅猛发展&#xff0c;分析数据的方式也发生了显著的变化。增强分析&#xff08;Augmented Analytics&#xff09;是近年来涌现出的新概念&#xff0c;它将人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;和自然语言处理&…