算法学习笔记(一)-快速幂

news2024/11/17 8:24:54

#问题的引入-对于幂次方的求解我们怎么可以最大限度的降低时间复杂度呢

#对于一个基本的幂次运算,c++代码如下示例

long long int myPower(int base,int power)
{
    long long int result = 1 ;
    
    for (int i = 1 ; i <= power ; i++)
    {
        result *= base ;
    }
    return result ;
}

#python代码示例

def myPower(base,power) :
    res = 1
    for i in range(power):
        res *= base
    return res

 ##通过对一个问题的拆分-我们来了解快速幂到底是一个怎么样子的过程:

对于一个7**10,常规思想便是循环累乘,我们需要将10个7累乘起来,但是我们也可以将7**5,然后再平方也可以得到正确答案,我们也可以7*7,49*49*7,然后再平方我们也可以得到正确答案;显而易见,快速幂就是一个二分的思路,可以将原本的O(n)的时间复杂度降为O(logn)的时间复杂度。

##递归快速幂

当n为偶数的时候,计算a**(n//2),当n为奇数的时候,先计算a**((n-1)//2)再乘a。

##c++代码如下示例

int quickPower(int a,int n)
{
    if (n == 0)
    {
        return 1 ; //递归的出口位置
    }
    else if (n % 2 == 1)
    {
        return quickPower(a,n-1) * a ;
    }
    else
    {
        int temp = quickPower(a,n/2);
        return temp * temp ;
    }
    return 0 ;
    //temp这个变量是必要的,quickPower(a,n/2) * quickPower(a,n/2),算法的时间复杂度会退化成O(n)
}

##python代码如下示例

def quickPower(a,n):
    if n == 0 :
        return 1
    elif n % 2 == 1 :
        return quickPower(a,n-1) * a
    else:
        temp = quickPower(a,n/2)
        return temp * temp

 ##递归快速幂(对大素数取模)

##c++代码示例

#define MOD 1000000007

typedef long long ll ;

ll quickPower(ll a,ll n)
{
    if (n == 0)
    {
        return 1 ;
    }
    else if (n % 2 == 1)
    {
        return quickPower(a,n/2) % MOD ;
    }
    else
    {
        ll temp = quickPower(a,n/2) % MOD
        return temp * temp % MOD ;
    }
}

 ##非递归快速幂

#c++代码示例

int quickPower(int a,int n)
{
    int ans = 1 ;
    while (n):
        if (n & 1)
        {
            ans *= a ;
        }
        
        a *= a ;
        n >>= 1 ;
    return ans ;
}

 

##python代码示例

def quickPower(a,n):
    res = 1
    while n :
        if n & 1 :
            res *= a
        a *= a
        n >>= 1
    return res

        在算 𝑎**n 时,只要a的数据类型支持乘法满足结合律,快速幂的算法都是有效的。矩阵、高精度整数,都可以照搬这个思路。下面给出一个c++模板:

//非递归快速幂模板-泛型
template <typename T>
T quickPower(T a,T n)
{
    T ans = 1 ;
    while (n)
    {
        if (n & 1)
        {
            ans = ans * a ;
        }
       
        n >>= 1 ;
        a = a * a ;
    }
    return ans ;
    //最好别用自乘,重载完*还得重载*=
}

 ##题目示例(洛谷1962-求解斐波那契数列-快速幂的经典应用):

##题目分析

我们通过基本的线性代数知识可以进行推导出来如下图示

##c++代码示例

#include <cstdio>
#define MOD 1000000007
typedef long long ll ;

struct matrix
{
    ll a1,a2,b1,b2 ;
    //构造函数中初始化这四个成员变量。重载了乘法运算符,实现了两个矩阵相乘的功能。
    matrix(ll a1 , ll a2 , ll b1 , ll b2) : a1(a1) , a2(a2) , b1(b1) , b2(b2) {}
    matrix operator*(const matrix &y)
    {
        matrix ans(
                    (a1 * y.a1 + a2 * y.b1) % MOD,
                    (a1 * y.a2 + a2 * y.b2) % MOD,
                    (b1 * y.a1 + b2 * y.b1) % MOD,
                    (b1 * y.a2 + b2 * y.b2) % MOD
                    ) ;
        return ans ;
    }
};

matrix quickPower(matrix a , ll n)
{
    matrix ans(1,0,0,1) ; //单位矩阵
    while (n)
    {
        if (n & 1)
        {
            ans = ans * a ;
        }
        a = a * a ;
        n >>= 1 ;
    }
    return ans ;
}

int main()
{
    ll x ;
    matrix M(0,1,1,1) ;
    scanf("%lld",&x);
    matrix ans = quickPower(M,x-1) ;
    printf("%lld\n",(ans.a1,ans.a2) % MOD) ;
    return 0 ; 
}

#python代码示例

MOD = 1000000007
# import torch
class Matrix:
    def __init__(self,a1,a2,b1,b2):
        self.a1 = a1
        self.a2 = a2
        self.b1 = b1
        self.b2 = b2

    def __mul__(self, y):
        return Matrix(  (self.a1 * y.a1 + self.a2 * y.b1) % MOD,
                        (self.a1 * y.a2 + self.a2 * y.b2) % MOD,
                        (self.b1 * y.a1 + self.b2 * y.b1) % MOD,
                        (self.b1 * y.a2 + self.b2 * y.b2) % MOD)

def quick_power(n):
    ans = Matrix(1,0,0,1)
    a = Matrix(0,1,1,1)
    while n :
        if n & 1 :
            ans  = ans.__mul__(a)

        a = a.__mul__(a)
        n >>= 1
    return ans
x = int(input())
# M = Matrix(0,1,1,1)
ans = quick_power(x-1)
print((ans.a1 * 1 + ans.a2 * 1) % MOD)

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

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

相关文章

架构每日一学 6:作为架构师,你必须学会寻找商业模式

本文首发于公众平台&#xff1a;腐烂的橘子 在前面的文章中&#xff0c;我们已经讲了架构师的两条生存法则&#xff0c;第一条是有且仅有一个目标&#xff0c;感兴趣的可以看一下原文&#xff1a; 架构每日一学 2&#xff1a;架构师六个生存法则之一&#xff1a;架构必须有且仅…

IC卡16个扇区详解:揭秘智能卡的存储结构

目录标题 IC卡的基本结构扇区的划分扇区的功能扇区的安全性扇区的应用NFC卡和IC卡&#xff0c;从外观怎样区分总结 在智能卡的世界里&#xff0c;IC卡&#xff08;Integrated Circuit Card&#xff09;以其安全性和便捷性成为了现代生活中不可或缺的一部分。无论是用于支付、身…

【讲解下iCloud如何高效利用】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【算法】二分查找——二分查找

本节博客详述“二分查找”并且以例子来进行讨论&#xff0c;有需要借鉴即可。 目录 1.二分查找1.1使用前提1.2模板 2.题目3.题解代码示例4.二分查找的一般模板5.总结 1.二分查找 1.1使用前提 使用的条件&#xff1a;数组具有“二段性”&#xff0c;二段性指的是数组可以根据某…

2024 年 4 月区块链游戏研报:市场低迷中活跃用户数创新高

2024 年 4 月区块链游戏研报 作者&#xff1a;stellafootprint.network 数据来源&#xff1a;GameFi 研究页面 2024 年 4 月&#xff0c;Web3 游戏领域在经历 3 月创纪录的表现后&#xff0c;迎来了显著波动。比特币自历史高位回调&#xff0c;月跌幅达到 10.4%。与此同时&a…

详细分析Vue3中的ref(附Demo)

目录 前言1. 基本知识2. Demo 前言 由于新项目涉及Vue3&#xff0c;本着探究问题的本质研究所不会的疑问 1. 基本知识 ref 是 Vue 3 中用于创建响应式数据的函数 接收一个初始值并返回一个包含了该值的响应式引用对象与 Vue 2.x 中的 data 属性不同&#xff0c;ref 返回的是…

Navicat Premium安装pojie版

下载、安装mysql&#xff0c;环境变量配置 1、官网下载mysql&#xff1a;https://www.mysql.com/downloads/ 下载成功&#xff0c;进行安装 一直点下一步 验证&#xff0c;开始中搜索mysql 说明安装成功 环境变量配置 默认安装路径C:\Program Files\MySQL …

2024年高考倒计时精品网页

2024年高考倒计时精品网页 前言效果图部分代码领取源码下期更新预报 前言 随着季风轻轻掠过&#xff0c;岁月如梭&#xff0c;再次迎来了这个属于青春与梦想交汇的时刻——高考。这是一场知识的较量&#xff0c;更是一次意志的考验。在这最后的冲刺阶段&#xff0c;每一刻都显…

Vision Mamba 代码调试---Pycharm+AutoDL

《AutoDL使用手册》 1. 服务器租用与配置 先上项目链接&#xff1a; GitHub - hustvl/Vim: Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 1.1 服务器租用与配置 根据环境要求&#xff0c;去租一个服务器&#xff1a;AutoDL算…

一文读懂通用漏洞评分系统CVSS4.0:顺带理清CVE、CWE及其与CVSS之间的关系

事件响应和安全团队论坛 (FIRST&#xff0c;Forum of Incident Response and Security Teams) 于 2023 年 11 月 1 日正式推出第四版通用漏洞评分系统 (CVSS 4.0&#xff0c;Common Vulnerability Scoring System version 4.0)。CVSS 4.0 是评估计算机系统安全漏洞严重性的行业…

初次查询大数据信用报告,需要注意哪些问题?

随着大数据的普及&#xff0c;基于大数据技术的大数据信用也变得越来越重要&#xff0c;比如在申贷之前&#xff0c;不少地方都会查询申贷人的大数据信用&#xff0c;作为风险控制的必要手段&#xff0c;那对于初次查询大数据信用报告的人来说&#xff0c;需要注意哪些问题呢?…

干部选拔任用的重要性与实践策略

在当今的组织管理中&#xff0c;干部选拔任用是一项至关重要的工作。它不仅关系到组织的稳定与发展&#xff0c;更直接影响到组织的效能和竞争力。因此&#xff0c;科学、公正、有效的干部选拔任用机制对于组织的长期健康发展具有不可忽视的意义。 一、干部选拔任用的重要性 …

产品经理资料包干货

1.《产品汪》免费电子书 2016年我面试了差不多有200多位产品求职者&#xff0c;其中不乏之前做厨师编剧这些岗位的人。在这个过程中我意识到大众或许对产品经理这个岗位存在一些认知和理解上的误差&#xff0c;于是我就想着写一本产品经理相关的书。 关于本书的更多信息可查看…

研究生学习---找工作

规划 研一~研二上学期完成小论文&#xff0c;实习&#xff0c;秋招 竞赛&#xff1a;kaggle&#xff1f; 面试题一般简单且为原题&#xff0c;笔试题目很难&#xff0c;不会出原题 项目 找工作软件

webapi路由寻址机制

路由匹配的原则 1、启动 Application_Start 文件夹中有个WebApiConfig 会把路由规则写入一个容器 2、客户端请求时&#xff1a; 请求会去容器匹配&#xff0c;先找到控制器&#xff08;找到满足的&#xff0c;就转下一步了&#xff09;&#xff0c;然后找Action&#xff0c;we…

菲律宾签证照片尺寸要求,用手机生成

菲律宾签证照片尺寸要求如下图所示&#xff0c;可以用手机在微信搜索随时照小程序&#xff0c;快速生成哦。

MIT 6.5840(6.824) Lab1:MapReduce 设计实现

1 介绍 本次实验是实现一个简易版本的MapReduce&#xff0c;你需要实现一个工作程序&#xff08;worker process&#xff09;和一个调度程序&#xff08;coordinator process&#xff09;。工作程序用来调用Map和Reduce函数&#xff0c;并处理文件的读取和写入。调度程序用来协…

IPsec VPN简介

什么是IPsec&#xff1f; IPsec&#xff08;Internet Protocol Security&#xff09;是为IP网络提供安全性的协议和服务的集合&#xff0c;它是VPN&#xff08;Virtual Private Network&#xff0c;虚拟专用网&#xff09;中常用的一种技术。其实就是一种协议簇&#xff08;类…

linux 任务管理(临时任务定时任务) 实验

目录 任务管理临时任务管理周期任务管理 任务管理 临时任务管理 执行如下命令添加单次任务&#xff0c;输入完成后按组合键Ctrl-D。 [rootopenEuler ~]# at now5min warning: commands will be executed using /bin/sh at> echo "aaa" >> /tmp/at.log at&g…

中国目前比较有影响力的人物颜廷利:物质与无知通音

既然是在中国优秀传统文化之根-汉语当中&#xff0c;汉字‘物质’二字跟‘无知’通音&#xff0c;因此&#xff0c;面对当前金钱肆虐、物欲横流的现实生活&#xff0c;当人类众生把‘物质’&#xff08;无知&#xff09;生活看的太真、太重时&#xff0c;那么&#xff0c;这就很…