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

news2024/10/3 6:29:30

[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.coloradmin.cn/o/2185732.html

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

相关文章

光通信——PON系统典型组网

PON系统可同时承载包括Internet上网、VoIP语音、IPTV视频、TDM数据专线、以太网专线、基站回传等业务在内的多种业务&#xff0c;实现全业务承载&#xff0c;此外&#xff0c;还可通过三波方案承载CATV业务&#xff0c;实现“三网融合” 。 CATV&#xff08;Community Antenna…

数字控制系统

目录 两轮自平衡式机器人的控制器设计 TMS320F28069 芯片特点 处理器引脚及功能 首先分析模型来确定控制原理 速度控制器 方向控制器 系统控制框架 智能平衡移动机器人PID控制 两轮自平衡式机器人的控制器设计 由于两轮自平衡式机器人的自不稳定性&#xff0c;控制起来…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.7-2.8

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第二周 深度卷积网络&#xff1a;实例探究&#xff08;Deep convolutional models: case studies&#xff09;2.7 Inception 网络&#xff08;Inception network&#xff09;2.8 使 用 开 源 …

C++容器之list基本使用

目录 前言 一、list的介绍&#xff1f; 二、使用 1.list的构造 2.list iterator的使用 3.list capacity &#x1f947; empty &#x1f947;size 4.list element access &#x1f947; front &#x1f947; back 5.list modifiers &#x1f947; push_front &#x1f947; po…

Apache POI 2024/10/2

导入Apache POI的maven坐标 通过POI向Excel文件写入文件内容 package com.sky.test;import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File; import java.…

在Linux系统安装Nginx

注意&#xff1a;Nginx端口号是80(云服务器要放行) 我的是基于yum源安装 安装yum源(下面这4步就好了) YUM源 1、将源文件备份 cd /etc/yum.repos.d/ && mkdir backup && mv *repo backup/ 2、下载阿里源文件 curl -o /etc/yum.repos.d/CentOS-Base.repo ht…

java OOP基础:类与对象(万字长文)

目录 类与对象 自定义类 对象的内存模型 “”赋值 对象引用&#xff1a;this 作为常量的对象变量:final 判等操作 1. “重写&#xff08;override&#xff09;”基类的equals()方法 2. “重载&#xff08;overload&#xff09;”equals()方法 对象的构造 有参构造与无…

腾讯云轻量服务器+宝塔面板+基于springboot的web网页部署

经历了一段时间的折磨&#xff0c;近期也在看数据挖掘&#xff0c;还有最优化算法&#xff0c;现在基于我上一篇的的问题上&#xff0c;现在你的情况是不是&#xff1a;本地已经存在一个Springboot的项目&#xff0c;在本地能够良好运行。现在你要做的是把自己的项目部署到网上…

B树、B+树

前言 B树和B树都是平衡的多路搜索树&#xff0c;它们在数据库和文件系统中广泛使用&#xff0c;用于存储和检索数据。B是指balance&#xff0c;也就是平衡的意思。那这俩与平衡二叉树有啥区别&#xff1f;首先要知道AVL树与B树、B树他们都是自平衡搜索树。 ALV的子树间高度不会…

知识图谱入门——4:Protégé 5.6.4安装和主要功能介绍、常用插件(2024年10月2日):知识图谱构建的利器

Protg 是斯坦福大学开发的一款开放源代码的本体编辑工具。它为构建、共享和管理本体&#xff08;Ontologies&#xff09;提供了一个强大的平台&#xff0c;广泛应用于语义网、知识管理、自然语言处理等领域&#xff0c;特别是知识图谱的开发和管理。Protg 支持 OWL&#xff08;…

Android-Handle消息传递和线程通信

本文为作者学习笔记&#xff0c;如有误&#xff0c;请各位大佬指点 目录 一、同步异步 二、Java多线程通信 三、Handler是什么 四、Handler相关的类 五、Handler常用方法 1. 发送消息 2. 接收处理消息 3. 切换线程 六、使用Handler 使用Handler更新UI 使用Handler延…

【MAUI】CommunityToolkit社区工具包介绍

一、为什么需要声明式开发 .NET的MVVM,始于WPF,很古典,它甚至可能是现代前端框架“声明式开发”的鼻祖。声明式开发,之所以出现,是因为命令式开发在UI层和代码层上无法解耦的问题。如下图所示: 1、命令式开发:后台代码需要调用UI层的控件(label.Text),如果更新UI层…

植物病虫害检测数据集 7800张 病虫害 带标注 voc yolo 7类

植物病虫害检测数据集 7800张 病虫害 带标注 voc yolo label| pic_ num| box_ num 越橘: . (932&#xff0c;980) 粘虫: (1104&#xff0c; 1104) 稻苞虫: (1389&#xff0c; 2269) 蝗虫: (1198&#xff0c; 1563) 蝽象若虫: (1594&#xff0c; 2576) . 绿蝽象: (1166&#xf…

微服务nginx解析部署使用全流程

目录 1、nginx介绍 1、简介 2、反向代理 3、负载均衡 2、安装nginx 1、下载nginx 2、解压nginx安装包 3、安装nginx​编辑 1、执行configure命令 2、执行make命令 4、启动nginx 1、查找nginx位置并启动 2、常用命令 3、反向代理 1、介绍反向代理配置 1、基础配置…

渗透测试入门学习——编写python脚本实现对网站登录页面的暴力破解

进入靶场输入任意密码进行尝试 发现登陆失败的特征字&#xff1a;“Username and/or password incorrect” 推荐用谷歌浏览器&#xff0c;按F12继续查看请求地址、请求头参数等详细信息&#xff0c;着重关注是否需要Cookie 编写python脚本 import requests # 填入请求地址 u…

Pikachu-csrf-CSRF(POST)

发起请求 拦截抓包&#xff0c;在请求信息中&#xff0c; Engagement Tool --》generate CSRF PoC 得到以下 html 代码 &#xff0c;生成poc.html 文件&#xff0c;当用户点击 <html><!-- CSRF PoC - generated by Burp Suite Professional --><body><…

C++仿函数的介绍以及priority_queue的介绍和模拟实现

目录 1.仿函数 1.1仿函数的介绍 1.2自定义类型使用仿函数 1.3自定义支持比较大小&#xff0c;但是比较的逻辑不是自己想要的逻辑 2.优先级队列priority_queue 2.1priority_queue的介绍 2.2priority_queue的使用 2.3priority_queue的模拟实现 1.仿函数 1.1仿函数的介绍…

Redis中一些其他的数据类型渐进式遍历

我们之前说了redis中的五个类型 分别是&#xff1a;String List Hash Set ZSet&#xff0c;那除了这五个redis文档中还给我们提供了一些其他的数据类型 &#xff08;一&#xff09;一些其他的数据类型 1.stream 这里的数据类型我们只做简单的一些介绍&#xff0c;如果想了解具体…

C++ | Leetcode C++题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; class Solution { public:int findMinArrowShots(vector<vector<int>>& points) {if (points.empty()) {return 0;}sort(points.begin(), points.end(), [](const vector<int>& u, const vector<int>&…

[云] Hands-on with a sample application--DockerCoins 挖矿程序!

DockerCoins 挖矿程序&#xff01;&#x1f4b0;&#x1f433;&#x1f4e6;&#x1f6a2; 不&#xff0c;你不能用 DockerCoins 买咖啡。 DockerCoins 如何工作&#xff1a; 生成一些随机字节&#xff1a; 程序首先生成一串随机的字节数据。这些随机字节用于模拟挖矿过程中的…