蓝桥杯-数的潜能-求快速幂

题目

思路

--将数字拆分成加和的形式,并且相乘。数据范围到10的18次方,暴力肯定不行,要找规律。拆分成1肯定不行,对乘法没有贡献,2可以,3也可以,4、5、6等大于3的数字都可以用2和3来表示。所以就有了方向了,将数字拆分成2、3,其个数用num2和num3来表示,结果res就可以由幂运算求得。然后再进一步考虑,是拆成2好呢,还是拆成3好。先找几个例子看看,4可以拆成2 2和1 3,显然2 2更好,5可以拆成2 3,这个明显是最优情况,6可以拆成2 2 2和3 3,显然3 3更好,再往后看就和前面几种情况重复了。4 % 3 = 1, 5 % 3 = 2, 6 % 3 = 0,只有这3种情况了。所有的数对3取余余数只有0、1、2三种可能。如果余数为1,就将num3的个数-1,替换成2个2;如果余数为2,num2就等于1了;如果余数为0,那很好,全都是3,num3 = n / 3。

--下面最关键的就是求幂了,我刚开始用的pow(),幂指数太大了,不行,然后又用for循环,超时。最后在网上找了求快速幂的迭代方法。如果用for循环求幂,那就是3 * 3 * 3 * 3 * ...,但是如果用快速幂,就是先算3 * 3 = 9,指数x缩小2倍,然后9 * 9 = 81,指数x缩小再2倍,再接着81 * 81,x /= 2...类似于二分吧,如果x是奇数,再将底数乘以3就好了,采用的是一种降幂增低的方法。底数也在指数倍增长,减少了许多重复的计算。

--还有一点,就是n等于1的情况,我刚开始没有考虑到。

代码

#include <iostream>
#include <cmath>
using namespace std;

int mi(long long x){
    int y = 1; //初始化结果为1。 
    int ji = 3; //底数为3,也表示累乘的结果。 
    while (x){
        if (x & 1){ //and位运算,如果x二进制数的最低位为1,结果为1,否则是0。即x是奇数。 
            y = y * ji % 5218; 
        }
        ji = ji * ji % 5218;
        x /= 2; 
    } //x最后一定为1,再最后才为0。 
    
    return y;
} //迭代法快速求幂。 

int main(){
    long long n;
    cin >> n;
    
    if (n == 1){
        cout << "1" << endl;
        return 0;
    } //考虑n = 0的特殊情况。 
     
    long long num2, num3;
    num2 = num3 = 0;
    int yu = n % 3;
    if (yu == 0){
        num3 = n / 3;
    } //3*3 > 2*2*2 
    else if (yu == 1){
        num3 = n / 3 - 1;
        num2 = 2;
    } //1*3 < 2*2
    else{
        num3 = n / 3;
        num2 = 1;
    } //一个2,剩下的都是3 
    
    long long res = 1;
    for (int i = 0; i < num2; i++){
        res *= 2;
    }
    res = res * mi(num3) % 5218;
    cout << res << endl;
    
    return 0;
}

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

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

相关文章

【堆】Top-K问题

标题&#xff1a;C语言库函数scanf&#xff08;&#xff09;解读 水墨不写bug &#xff08;图片来源于网络&#xff09; 正文开始&#xff1a; Top-K问题是一类问题的统称&#xff1a; 即根据对象的某一属性&#xff0c;找出这个属性最突出的K个对象&#xff0c;并且通常对象…

简单了解多线程

并发和并行 并发&#xff1a; 在同一时刻&#xff0c;多个指令在单一CPU上交替指向 并行&#xff1a;在同一时刻&#xff0c;多个指令在多个CPU上同时执行 2核4线程&#xff0c;4核8线程&#xff0c;8核16线程&#xff0c;16核32线程 基础实现线程的方式 Thread :继承类 &…

OpenJDK11的安装及配置

OpenJDK11的安装及配置: 下载链接&#xff1a;http://jdk.java.net/archive/ 1. 下载 点击链接下载OpenJDK11的zip压缩文件** 选择Windows版本 解压 解压成功。 2. 环境配置 打开设置----选择相关设置中的高级系统设置 选择高级—环境变量 系统变量 下添加JAVA_HOME …

开发技术-FeignClient 对单个接口设置超时时间

1. 背景 FeignClient 调用某个接口&#xff0c;3s 没有结果就需要停止&#xff0c;处理后续业务。 2. 方法 FeignClient 自定义 name 属性 FeignClient(name "aaa" , url "xxx") public interface TestApi {ResponseBodyPOSTMapping(value "xx…

STM32编程控制电机实现PID速度闭环中的堵转检测

实现PID速度闭环控制是编码器电机驱动中的重要任务&#xff0c;而堵转检测和控制则是保证电机正常运行的关键环节。在本文中&#xff0c;我们将详细探讨STM32编程驱动编码器电机实现PID速度闭环控制中堵转检测和控制的方法。 一、堵转检测方法 编码器反馈&#xff1a; 编码器…

软考 系统架构设计师系列知识点之系统性能(1)

所属章节&#xff1a; 第2章. 计算机系统基础知识 第9节. 系统性能 系统性能是一个系统提供给用户的所有性能指标的集合。它既包括硬件性能&#xff08;如处理器主频、存储器容量、通信带宽等&#xff09;和软件性能&#xff08;如上下文切换、延迟、执行时间等&#xff09;&a…

【零基础C语言】内存中的存储

一. 整数在内存中的存储 1.原码反码补码 在计算机中整数在内存中存储的是二进制数 二进制的存储有三种表示的方式: 原码反码补码 这三种表示方式又分为符号位和数值位&#xff1a; 符号位中0表示正数&#xff0c;1表示负数&#xff0c;最高位被当作符号位&#xff0c;其他为…

DML - 增删改(insert into,delete,update)

引言&#xff1a;对比DB / 表结构 : create , drop , alter 本次记录 数据操作 语言&#xff1a; 1.进入 hive 数据库&#xff0c;再打开 ryx1 表 2. insert select 3. update select 4. delete select

JVM学习-类加载

目录 1.类文件结构 2.类加载器 3.类加载的三个阶段 3.1加载 3.2链接 3.2.1验证 3.2.2准备阶段 3.2.3解析阶段 3.3初始化 4.拓展&#xff1a;反射 4.1获取类对象 4.2创建实例 4.3获取方法 4.4方法调用 1.类文件结构 2.类加载器 类加载器用来将类文件的二进制字节码加载到JV…

3 CUDA硬件概述

3.1 PC 架构 首先&#xff0c;我们看看当下许多PC中都使用的酷睿2(Core2)处理器的典型架构&#xff0c;然后分析一下它是如何影响我们使用GPU 加速器的(如图 3-1所示)。 图3-1典型的酷睿2(Core2)系列处理器的结构图 由于所有的 GPU 设备都是通过 PCI-E(Peripheral Communicat…

修改约束

目录 修改约束 创建数据库 添加约束 删除约束 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 修改约束 如果说表结构的修改还在可以容忍的范畴之内&#xff0c;那么约束的修改是绝对 100% 禁止的 所有的约束一定要在…

王者荣耀使用的UDP通信,十几年编程没用过的协议

缘起 最近在查阅moba相关的资料时&#xff0c;看到了一篇王者荣耀的研发同学的技术分享&#xff0c;从文章中了解到王者荣耀的通信方式是UDP通信&#xff0c;回想到整个职业生涯&#xff0c;貌似并没有用过&#xff0c;今天特地整理下。 udp技术细节 udp协议 UDP协议叫做用…

代码随想录算法训练营三刷day29 | 回溯算法之 491.递增子序列 46.全排列 47.全排列 II

三刷day29 491.递增子序列回溯三部曲 46.全排列回溯三部曲 47.全排列 II 491.递增子序列 题目链接 解题思路&#xff1a; 回溯三部曲 递归函数参数 本题求子序列&#xff0c;很明显一个元素不能重复使用&#xff0c;所以需要startIndex&#xff0c;调整下一层递归的起始位…

c语言指针(二)

文章目录 c语言指针&#xff08;二&#xff09;1.数组名的理解2.使用指针访问数组3.一维数组的传参本质 c语言指针&#xff08;二&#xff09; 1.数组名的理解 int arr[10] { 1,2,3,4,5,6,7,8,9,10 }; int* p &arr[0]这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元…

系统设计实例(一)百万级别用户系统

二、百万级别用户系统 原则&#xff1a; 尽可能地缓存数据采用无状态Web层支持多个数据中心在 CDN 中托管静态资源通过分片扩展数据层将层级拆分为独立的服务 负载均衡器 负载均衡器会将传入的流量均匀分配给在负载均衡集合中定义的Web服务器&#xff0c;用户直接连接负载均…

【C++ leetcode】双指针问题(续)

3. 202 .快乐数 题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结…

文件IO (File对象, 文件读写)

文件 狭义的文件: 硬盘上的文件和目录(文件夹) 广义的文件: 泛指计算机中的很多 软硬件资源 OS 中, 把很多硬件设备和软件资源抽象成了文件, 按照文件的方式来统一管理网络编程中, OS 把网卡当成了一个文件来操作 路径 绝对路径: 以盘符**(c: d: e:)**开头的路径 相对路径: 以 …

HarmonyOS ArkTS 通用事件(二十三)

通用事件目录 点击事件事件ClickEvent对象说明EventTarget8对象说明示例 触摸事件事件TouchEvent对象说明TouchObject对象说明示例 挂载卸载事件事件示例 点击事件 组件被点击时触发的事件。 事件 ClickEvent对象说明 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中…

C++:继承:面向对象编程的重要特性

(❁◡❁)(●◡●)╰(*▽*)╯(*/ω&#xff3c;*)(^///^)(❁◡❁)(❁◡❁)(●◡●)╰(*▽*)╯(*/ω&#xff3c;*)(❁◡❁)(●’◡’●)╰(▽)╯(/ω&#xff3c;)(///) C&#xff1a;继承&#xff1a;面向对象编程的重要特性 前言**继承**1.继承的概念及定义1.1继承的概念1.2继…

学完Python的7大就业方向,哪个赚钱最多?

“ 我想学Python&#xff0c;但是学完Python后都能干啥 &#xff1f;” “ 现在学Python&#xff0c;哪个方向最简单&#xff1f;哪个方向最吃香 &#xff1f;” “ …… ” 相信不少Python的初学者&#xff0c;都会遇到上面的这些问题。大家都知道Python很吃香&#xff0c;薪资…