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

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

#对于一个基本的幂次运算,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://xiahunao.cn/news/3031625.html

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

相关文章

LLMs应被视为一种文字计算器?

编者按&#xff1a;当前&#xff0c;大语言模型已经成为自然语言处理领域的热点。LLMs 是否真的“智能”&#xff1f;它们又为我们带来了哪些启发&#xff1f;针对这些问题&#xff0c;Darveen Vijayan 为我们带来了这篇引人深思的文章。 作者主要阐释了两个观点&#xff1a;第…

linux上用Jmter进行压测

在上一篇中安装好了Jmeter环境&#xff0c;在这一篇中将主要分享如何使用jmeter在linux中进行单机压测。 1.项目部署 在这里我们先简单部署一下测试环境&#xff0c;所用到的项目环境是个jar包&#xff0c;先在linux上home目录下新建app目录&#xff0c;然后通过rz命令将项目ja…

2万字干货:如何从0到1搭建一套会员体系(2)

2.用户等级 还是一样&#xff0c;我们为什么要搭建用户等级&#xff1f; 一个国家有几亿人口的时候你怎么来管理&#xff1f;老祖宗秦始皇给出了我们答案&#xff1a;郡县制。发展到现在则演进成了省-市-区县-乡镇(街道)-村(社区)5层行政治理结构。 产品同理&#xff0c;当你…

Flume 的安装和使用方法(Spark-2.1.0)

一、Flume的安装 1.下载压缩包 https://www.apache.org/dyn/closer.lua/flume/1.7.0/apache-flume-1.7.0-bin.tar.gz 2.上传到linux中 3.解压安装包 cd #进入加载压缩包目录sudo tar -zxvf apache-flume-1.7.0-bin.tar.gz -C /usr/local # 将 apache-flume-1.7.0-bin.tar.g…

文旅行业| 某景区导游培养和管理项目成功案例纪实

——整合导游资源并进行统一管理&#xff0c;构建完善的培养与管理机制&#xff0c;发挥景区导游价值 【客户行业】文旅行业&#xff1b;景区&#xff1b;文旅企业 【问题类型】人才培养&#xff1b;人员管理 【客户背景】 南方某5A级景区&#xff0c;作为国内极具代表性和特…

经常睡不好觉?试试用上华为手环9新升级的睡眠监测功能

睡眠问题是不是经常困扰着你呢&#xff1f;听说&#xff0c;华为手环9的睡眠监测功能升级了&#xff0c;无论是入睡前、睡眠中还是睡醒后&#xff0c;都能够帮助我们改善睡眠&#xff0c;让我们告别糟糕的睡眠质量&#xff01; 睡觉前&#xff0c;打开华为手环9的睡眠模式&…

寻找最大价值的矿堆 - 矩阵

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、Java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布一些解题思路&#xff0c;希望大家多指教 一、题目描述 给你一个由’0’(空地)、‘1’(银矿)、‘2’(金矿)组成的地图…

自动化测试基础 --- Jmeter

前置环境安装 首先我们需要知道如何下载Jmeter 这里贴上下载网站Apache JMeter - Download Apache JMeter 我们直接解压,然后在bin目录下找到jemter.bat即可启动使用 成功打开之后就是这个界面 每次打开可以用这种方式切换成简体中文 或者直接修改properties文件修改对应的语言…

第七届精武杯部分wp

第一部分&#xff1a;计算机和手机取证 1.请综合分析计算机和手机检材&#xff0c;计算机最近一次登录的账户名是 答案&#xff1a;admin 创建虚拟机时直接给出了用户名 2. 请综合分析计算机和手机检材&#xff0c;计算机最近一次插入的USB存储设备串号是 答案&#xff1a…

01面向类的讲解

指针指向类成员使用 代码&#xff1a; #include<iostream> using namespace std;class Test { public:void func() { cout << "call Test::func" << endl; }static void static_func();int ma;static int mb; //不依赖对象 }; void Test::static…

探索GitHub上的GPTs项目:泄露和被破解的GPT提示

GPTs项目是一个在GitHub上由用户linexjlin发起的开源项目&#xff0c;专注于提供泄露的GPT&#xff08;生成式预训练转换器&#xff09;提示。这些提示用于指导和优化AI模型的输出&#xff0c;进而提升代码生成的质量和效率。项目页面提供了丰富的功能和资源&#xff0c;旨在帮…

全套停车场管理系统报价多少钱?停车场管理系统由哪些设备组成?

随着城市化进程的加快&#xff0c;汽车保有量的不断攀升&#xff0c;停车场的管理和运营成为城市基础设施建设的重要组成部分。一个高效、智能的停车场收费系统不仅能提升停车效率&#xff0c;还能增强用户体验&#xff0c;对城市的交通管理起到关键作用。本文将为您详细介绍全…

mac 讨厌百度网盘怎么办

一、别拦我 首先请允许我泄个愤&#xff0c;tmd百度网盘下个1g的文件下载速度竟然超不过200k&#xff0c;只要不放在所有已打开软件的最前面&#xff0c;它就给你降到10k以内&#xff0c;关键是你慢就慢了&#xff0c;我也不是很着急&#xff0c;关键是你日常下载失败并且总是…

AI代理和AgentOps生态系统的剖析

1、AI代理的构成&#xff1a;AI代理能够根据用户的一般性指令自行做出决策和采取行动。 主要包含四个部分&#xff1a; &#xff08;1&#xff09;大模型&#xff08;LLM&#xff09; &#xff08;2&#xff09;工具&#xff1a;如网络搜索、代码执行等 &#xff08;3&#x…

在Qt工具栏上实现矩阵并排的按钮效果源码

如果这个要用MFC去实现头皮都得掉一层&#xff0c;建议大家以后要写GUI方面的小工具尽量转QT或其他吧&#xff0c;MFC真不适合搞这种花里胡哨的界面. 在Qt工具栏上实现矩阵并排的按钮效果源码如下&#xff1a; #include "mainwindow.h" #include "ui_mainwind…

初识指针(4)<C语言>

前言 前面的文章&#xff0c;已经对指针的基础概念以及运用有了初步了解&#xff0c;我们可以进一步探究指针比较深入的知识&#xff0c;下文将主要介绍&#xff1a;使用指针数组模拟二维数组、字符指针变量、数组指针、二维数组传参的本质、函数指针、typedef关键字等。 目录…

RustDesk 自建服务器部署和使用教程

RustDesk 是一个强大的开源远程桌面软件&#xff0c;是中国开发者的作品&#xff0c;它使用 Rust 编程语言构建&#xff0c;提供安全、高效、跨平台的远程访问体验。可以说是目前全球最火的开源远程桌面软件了&#xff0c;GitHub 星星数量达到了惊人的 64k&#xff01; 与 Team…

洪水仿真模拟(ArcGIS),水利数字孪生新利器

这两天ArcGIS Pro的官方账号释放了一个名为“Flood Simulation in ArcGIS Pro”的洪水模拟功能视频。根据视频详情页的介绍&#xff0c;该洪水仿真模拟功能会作为新功能出现在ArcGIS Pro 3.3中。 由于我目前从事的主要应用方向都是弱GIS的领域&#xff0c;所以我已经很久没有再…

图片逐层矢量化

摘要 图像光栅化是计算机图形学中一个成熟的技术&#xff0c;而图像向量化&#xff0c;即光栅化的逆过程&#xff0c;仍然是一个主要的挑战。最近&#xff0c;基于深度学习的先进模型实现了向量化和向量图的语义插值&#xff0c;并展示了生成新图形的更好拓扑结构。然而&#…