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

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

#对于一个基本的幂次运算,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 = 1for i in range(power):res *= basereturn 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 1elif n % 2 == 1 :return quickPower(a,n-1) * aelse:temp = quickPower(a,n/2)return temp * temp

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

##c++代码示例

#define MOD 1000000007typedef 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) % MODreturn 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 = 1while n :if n & 1 :res *= aa *= an >>= 1return 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 = a1self.a2 = a2self.b1 = b1self.b2 = b2def __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 >>= 1return 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.hqwc.cn/news/696733.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络实验新境界,PNETLab模拟器部署指南

在网络工程领域&#xff0c;拥有一个可靠的网络实验平台至关重要。PNETLab模拟器是一款功能强大的网络仿真工具&#xff0c;它支持包括华为、华三、锐捷、思科在内的多种设备&#xff0c;并且以开源免费的形式提供&#xff0c;这使得它在业界备受青睐。 软件介绍 PNETLab&am…

K8s:二进制安装k8s(单台master)

一、安装k8s 1、拓扑图 2、系统初始化配置 #所有节点执行 systemctl stop firewalld systemctl disable firewalld iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X #永久关闭firewalld并清空iptables所有表规则 setenf…

标准输入输出流(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 输入三角形的三边a,b,c&#xff0c;计算三角形的面积。形成三角形的条件是ab>c,bc>a,ac>b&#xff0c;编写程序&#xff0c;输入a,b,c&#xff0c;检查a,b,c是否满足以上条件&#xff0c;如不满足&#xff0c;由cerr输出有关出错信息…

Spring框架核心:揭秘Java厨房的智能烹饪艺术

前情回顾&#xff1a;Spring框架深度解析&#xff1a;打造你的Java应用梦工厂 六. 实现控制反转 6.1 描述如何在Spring中实现IoC 在Spring Town的厨房里&#xff0c;实现控制反转就像是将食材的采购和准备过程外包给了一个智能系统。这个系统知道每种食材的特性&#xff0c;也…

Java String转JSONObject时保持字段顺序不变

Java String转JSONObject时保持字段顺序不变 问题背景解决方案 问题背景 在业务接口开发过程中&#xff0c;有一个新增接口&#xff0c;需要支持批量新增数据&#xff0c;这时入参就需要用到 json 格式数据&#xff0c;且包含 list 集合&#xff0c;比如这样的数据格式&#x…

Linux-磁盘管理类实训

一、Linux分区和磁盘操作命令 &#xff08;1&#xff09;将系统内所有的分区&#xff08;文件系统&#xff09;列出来&#xff09; &#xff08;2&#xff09;将系统中所有特殊文件格式及名称都列出来 &#xff08;3&#xff09;将/bin下面的可以用的磁盘容量以易读的容量格式…

做抖店如何提高与达人合作的几率?有效筛选+有效推品

我是王路飞。 总是有很多新手商家&#xff0c;找我吐槽&#xff0c;抖音上的达人特别不好找&#xff0c;好不容易加上了&#xff0c;要么是发消息不回复&#xff0c;要么是寄样后就没下文了。 虽然一直都说找达人带货玩法比较简单&#xff0c;但也离不开电商的基本逻辑&#…

【数据可视化01】matplotlib实例介绍1

目录 一、引言二、实例介绍1.柱状图1)简单柱状图2)堆叠柱状图 2.线条形式3.折线图&#xff08;多子图&#xff09;4.散点图5.水平和垂直线条6.饼状图1&#xff09;饼状图2&#xff09;“条形饼”图 一、引言 matplotlib是一个用于绘制数据可视化的Python库。它可以创建各种静态…

制造业如何挖掘数据价值,附数据分析处理软件推荐

制造业如何挖掘和利用数据价值&#xff1f; 在信息化、智能化高速发展的今天&#xff0c;制造业正迎来一场由数据驱动的深刻变革。数据&#xff0c;作为这场变革的核心驱动力&#xff0c;正被制造业企业深度挖掘和利用&#xff0c;以实现更高效、更智能的生产模式。 制造业在利…

252 基于MATLAB的自适应差分阈值法检测心电信号的QRS波

基于MATLAB的自适应差分阈值法检测心电信号的QRS波&#xff0c;QRS波群反映左、右心室除极电位和时间的变化&#xff0c;第一个向下的波为Q波&#xff0c;向上的波为R波&#xff0c;接着向下的波是S波。通过GUI进行数据处理&#xff0c;展示心率和QRS。程序已调通&#xff0c;可…

44.WEB渗透测试-信息收集-域名、指纹收集(6)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a; web指纹&#xff1a; 每一个网站&#xff0c;前端开发语言&#xff0c;后端语言&#…

【MySQL数据库开发设计规范】之字段设计规范

欢迎点开这篇文章&#xff0c;自我介绍一下哈&#xff0c;本人姑苏老陈 &#xff0c;是一名JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中&#xff0c;该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章&#xff0c;定期更新&#xff0c;欢迎关注&…