372. 超级次方

news2024/11/26 16:45:09

372. 超级次方

    • 题目
    • 算法设计:迭代
    • 算法设计:递归

 


题目

传送门:https://leetcode.cn/problems/super-pow/

题目不难懂,问题在于 b 是一个非常非常大的数,会溢出。

  • 迭代和递归,各有解决方法,记录在下文。

 


算法设计:迭代

防止溢出,迭代拆解幂。

a 1564 a^{1564} a1564

= a 4 ∗ a 60 ∗ a 500 ∗ a 1000 a^{4}*a^{60}*a^{500}*a^{1000} a4a60a500a1000

= a 4 ∗ ( a 10 ) 6 ∗ ( a 100 ) 5 ∗ ( a 1000 ) 1 a^{4} * (a^{10})^6 * (a^{100})^5 * (a^{1000})^1 a4(a10)6(a100)5(a1000)1

int ans = 1;
for (int i = b.size() - 1; i >= 0; i--) {     // 拆分幂
	ans = (ans * pow(a, b[i])) % k;           // a^1564 = a^4 * (a^10)^6 * (a^100)^5 * (a^1000)^1,% k 防止溢出 
	a = pow(a, 10);                           // a^10、a^100、a^1000、a^1000(不会代入计算)
}

 
快速幂:比普通求幂算法要快

int quick_pow(int a, int b) {                     // 快速幂log(N),普通幂O(N)
	if( b == 0 ) return 1;
	if( b % 2 != 0 )                              // k 是奇数
		return ( a % k * quick_pow( a, b-1 ) ) % k;
    else {                                        // k 是偶数
        int sub = quick_pow( a, b/2 );
        return ( sub * sub ) % k;
    }
}

 
此外,模运算防止溢出:

  • 正常模运算:(a × b) % k
  • 防溢出模运算:(a % k) * (b % k) % k
class Solution {
    const int k = 1337;

    int pow(int a, int b) {                           // 快速幂log(N),普通幂O(N)
        if( b == 0 ) return 1;
        if( b % 2 )                                   // k 是奇数
            return ( a % k * pow( a, b-1 ) ) % k;
        else {                                        // k 是偶数
            int sub = pow( a, b/2 );
            return ( sub * sub ) % k;
        }
    }
public:
    int superPow(int a, vector<int> &b) {
        int ans = 1;
        for (int i = b.size() - 1; i >= 0; i--) {     // 拆分幂
            ans = (ans * pow(a, b[i])) % k;           // a^1564 = a^4 + (a^10)^6 + (a^100)^5 + (a^1000)^1,% k 防止溢出 
            a = pow(a, 10);                           // a^10、a^100、a^1000、a^1000(不会代入计算)
        }
        return ans;
    }
};

 


算法设计:递归

防止溢出,递归拆分幂,分成俩部分:

  • 数组末尾 * (数组剩余部分)^10

a 1564 a^{1564} a1564

= a 4 ∗ a 1560 a^{4}*a^{1560} a4a1560

= a 4 ∗ ( a 156 ) 10 a^{4}*(a^{156})^{10} a4(a156)10

= a 4 ∗ ( a 6 ∗ ( a 15 ) 10 ) 10 a^{4}*(a^{6}*(a^{15})^{10})^{10} a4(a6(a15)10)10

= a 4 ∗ ( a 6 ∗ ( a 5 ∗ a 10 ) 10 ) 10 ) 10 a^{4}*(a^{6}*(a^{5}*a^{10})^{10})^{10})^{10} a4(a6(a5a10)10)10)10

int next_pow( int a, int i, vector<int>& b ) {        // 递归拆分幂,防止溢出
	if( i == -1 ) return 1;
	return ( quick_pow( a, b[i] ) * quick_pow( next_pow( a, i-1, b ), 10 ) ) % k;
    // 递归拆分幂,分成俩部分:数组末尾 * 数组剩余^10,再合并出俩者的结果 
}

 
此外,模运算防止溢出:

  • 正常模运算:(a × b) % k
  • 防溢出模运算:(a % k) * (b % k) % k

完整代码:

class Solution {
    int k = 1337;
public:
    int quick_pow(int a, int b) {                     // 快速幂log(N),普通幂O(N)
        if( b == 0 ) return 1;
        if( b % 2 != 0 )                              // k 是奇数
            return ( a % k * quick_pow( a, b-1 ) ) % k;
        else {                                        // k 是偶数
            int sub = quick_pow( a, b/2 );
            return ( sub * sub ) % k;
        }
    }
    int next_pow( int a, int i, vector<int>& b ) {    // 递归拆分幂,防止溢出
        if( i == -1 ) return 1;
        return ( quick_pow( a, b[i] ) * quick_pow( next_pow( a, i-1, b ), 10 ) ) % k;
        // 递归拆分幂,分成俩部分:数组末尾 * 数组剩余^10,再合并出俩者的结果 
    }
    int superPow(int a, vector<int>& b) {
        return next_pow( a, b.size()-1, b );                 // 从最后一位开始
    }
};

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

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

相关文章

Elasticsearch入门——kibanna和postman操作Elasticsearch索引示例

目录一、使用kibanna操作Elasticsearch索引示例二、使用postman操作Elasticsearch索引示例三、kibanna和postman操作Elasticsearch的总结一、使用kibanna操作Elasticsearch索引示例 启动Elasticsearch和kibanna服务&#xff0c;浏览器访问http://localhost:5601/,进入Dev Tools…

week11

T1汤姆斯的天堂梦 题目描述 汤姆斯生活在一个等级为 000 的星球上。那里的环境极其恶劣&#xff0c;每天 121212 小时的工作和成堆的垃圾让人忍无可忍。他向往着等级为 NNN 的星球上天堂般的生活。 有一些航班将人从低等级的星球送上高一级的星球&#xff0c;有时需要向驾驶…

【C语言】数据结构基础(每日小细节025),有三数之和哦

算法好题初阶&#xff08;一共14回已经更新完毕&#xff09;&#xff0c;从今天开始就是基础的数据结构题目 1.只出现一次的数字 如果不额外开辟任何空间的话一定要想到位运算符 异或^ :两个整数异或&#xff0c;遵循相同为0&#xff0c;相异为1的二进制位运算规则 &#x…

【Nginx 基础】

Nginx 的安装 Nginx 的静态网站部署 理解 Nginx 的反向代理与负载均衡&#xff0c;能够配置反向代理与负载均衡 一、 Nginx 概述 Nginx 是一款高性能的 HTTP 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;由俄罗斯的程序工程师伊戈…

spring学习系列

Spring_三种方式的依赖注入1.第一种&#xff0c;set方式&#xff0c;property2.构造器注入&#xff08;构造方法&#xff09;3.p命名空间注入4、注入各种数据类型//老师类 public class Teacher {private String name;private int age; }//课程类 public class Course {private…

云原生技术学习笔记(基础版)

一、容器基本概念容器运行时&#xff0c;多种虚拟化技术&#xff0c;runC、kata、gVisor等。containerd -shim不是个lib&#xff0c;是个守护进程&#xff0c;管理容器生命周期,可被containerd动态接管。&#xff08;可以从containerd中脱离出来&#xff0c;插件化管理&#xf…

jvm系列(1)--JVM和Java体系架构

目录Java-跨平台的语言JVM-跨语言的平台多语言混合编程虚拟机虚拟机概念Java虚拟机JVM的位置JVM的整体结构Java代码执行流程JVM的架构模型基于栈的指令集架构基于寄存器的指令级架构两种架构的举例JVM架构总结JVM的生命周期虚拟机的启动虚拟机的执行虚拟机的退出Java-跨平台的语…

VTK-vtkSelectPolyDataFilter

前言&#xff1a;本博文主要记录vtkSelectPolyDataFilter接口的应用&#xff0c;实现原理&#xff0c;以及与其近似的vtkClipPolyData&vtkImplicitSelectionLoop的应用相比较&#xff0c;帮助小伙伴理解vtkSelectPolyDataFilter接口的实现原理&#xff0c;并且与其它接口进…

2023新生个人训练赛第08场解题报告

问题 A: Candies 题目描述 We have a 2N grid. We will denote the square at the i-th row and j-th column (1≤i≤2, 1≤j≤N) as (i,j). You are initially in the top-left square, (1,1). You will travel to the bottom-right square, (2,N), by repeatedly moving ri…

鉴源论坛 · 观通丨轨交系统安全性设计

作者 | 刘艳青 上海控安安全测评中心安全测评部测试经理 版块 | 鉴源论坛 观通 引语&#xff1a;第一篇对轨交信号系统从铁路系统分类和组成、城市轨交系统分类和组成、城市轨交系统功能、城市轨交系统发展方面做了介绍&#xff0c;第二篇从信号基础出发&#xff0c;讲述了信…

【蓝桥杯算法 1】AcWing166.飞行员兄弟

本文已收录专栏 &#x1f332;《蓝桥杯周训练》&#x1f332; “飞行员兄弟”这个游戏&#xff0c;需要玩家顺利的打开一个拥有 16 个把手的冰箱。 已知每个把手可以处于以下两种状态之一&#xff1a;打开或关闭。 只有当所有把手都打开时&#xff0c;冰箱才会打开。 把手可…

支持数位板的远程软件,实现远程使用 Wacom 数位板

现在数位板越来越流行了&#xff0c;影视、动漫、游戏、设计等行业经常需要用到。Wacom 是数位板领域的全球领导者&#xff0c;其设备为创意人员带来了真正的纸感绘图体验。 数位板用户需要远程办公的时候&#xff0c;经常会遇到两个问题&#xff1a;远程软件不支持数位板、远…

(考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例

文章目录一&#xff1a;计算机网络结构分层的必要性&#xff08;1&#xff09;分层思想&#xff08;2&#xff09;计算机网络分层思想①&#xff1a;如何让两台计算机通过网线传输数据②&#xff1a;如何让分组在单个网络内传输③&#xff1a;如何让分组在网络间传输④&#xf…

SpringBoot项目练习

项目名称&#xff1a;旅游网站后台管理一&#xff1a;项目简介旅游网站后台管理,包括如下用户&#xff1a;旅游线路&#xff1a;线路图片&#xff1a;线路分类&#xff1a;旅行社&#xff1a;后台技术&#xff1a;springboot、mybatis、mybatis plus前台&#xff1a;bootstrap、…

测试开发 | 专项测试技术初识Hook

本文节选自霍格沃兹测试学院内部教材Hook 技术需要预先分析目标应用的源代码和逻辑&#xff0c;根据目标测试场景设置目标、逻辑和数据&#xff0c;然后运行时动态的对目标函数参数值、逻辑或者返回值做修改&#xff0c;达到修改现有函数逻辑、实现目标测试场景的目的。Hook的价…

JavaWeb基础(一) Mybatis使用详解

JavaWeb基础——Mybatis 1&#xff0c;配置文件实现CRUD 如上图所示产品原型&#xff0c;里面包含了品牌数据的 查询 、按条件查询、添加、删除、批量删除、修改 等功能&#xff0c;而这些功能其实就是对数据库表中的数据进行CRUD操作。接下来我们就使用Mybatis完成品牌数据的…

3-2存储系统-主存与CPU的连接外部存储器

文章目录一.主存与CPU的连接&#xff08;一&#xff09;连接原理&#xff08;二&#xff09;主存容量的扩展1.位扩展法2.字扩展法3.字位同时扩展法&#xff08;三&#xff09;存储芯片的地址分配和片选1.线选法2.译码片选法二.外部存储器&#xff08;一&#xff09;磁盘储存器1…

JVM-三色标记

一、什么叫三色标记三色也叫三色抽象&#xff0c;它是所有mutator和collector都必须遵守的定律。它把对象标记为三种颜色&#xff1a;白色&#xff1a;对象还未被垃圾收集器访问&#xff0c;在回收的开始阶段所有的对象均为白色&#xff08;当然了这只是指概念上的&#xff0c;…

PaddleNLP开源UTC通用文本分类技术,斩获ZeroCLUE、FewCLUE双榜第一

飞桨PaddlePaddle 2023-01-12 20:02 发表于湖北 针对产业级分类场景中任务多样、数据稀缺、标签迁移难度大等挑战&#xff0c;百度提出了一个大一统的通用文本分类技术UTC&#xff08;Universal Text Classfication&#xff09;。 UTC在ZeroCLUE和FewCLUE两个榜单上均位居榜首…

css加载会造成阻塞吗?

目录 A.设置网络加载速度 B.css加载会阻塞DOM树的解析渲染吗&#xff1f; 1.css会阻塞DOM树解析&#xff1f; 2.css加载会阻塞DOM树渲染&#xff1f; 3.个人对这种机制的评价 3.css加载会阻塞js运行吗&#xff1f; 4.结论 可以使用以下几种方法解决CSS加载速度的问题: …