数据结构学习 快速幂

news2024/12/23 0:48:58

看了这一篇很好的文章:快速幂,学习了一下快速幂。如果你看到这篇文章想要学习快速幂,我建议你直接去看这篇文章吧,下面的都是我个人的笔记和碎碎念。

重拾我的考研线性代数,非常有趣呢!

 基本的快速幂:


递归快速幂:

根据上面那张图,很容易写出递归快速幂的代码。

注意1:分0,奇数,偶数
注意2:为了防止溢出,取模,long long

#include <iostream>
#define MOD 1000000007//取模
//递归快速幂
//注意1:分0,奇数,偶数
//注意2:为了防止溢出,取模,long long
int qpow(int a, int n)//a^n
{
	if (n == 0)
		return 1;
	if (n & 1)//奇数
		return a * qpow(a, n - 1) % MOD;
	else//偶数
	{
		long long temp = qpow(a, n / 2) % MOD;
		return temp * temp % MOD;
	}
}

void Test_qpow1()
{
	int a = 2, n = 0;
	std::cout << "a: " << a << " n: " << n << " result: " << qpow(a, n) << std::endl;
	a = 2;
	n = 4;
	std::cout << "a: " << a << " n: " << n << " result: " << qpow(a, n) << std::endl;
	a = 2;
	n = 501;
	std::cout << "a: " << a << " n: " << n << " result: " << qpow(a, n) << std::endl;
}

非递归快速幂:

别人的写法:

这个就比较难了。利用的是将n化为二进制,用二进制的10来控制是否要乘入。

具体来看上面提到的那篇文章说的吧...:

模仿着写了一遍(弱弱地) 

#define MOD 1000000007//取模
//这是在网上看见的 比我写的好 但是有点难理解
//用了二进制
int qpow2(long long a, int n)//a^n
{
	long long mul = 1;
	while (n)//二进制,比如5:101,在1的时候才乘进来
	{
		if (n & 1)
			mul = mul * a;
		n>>=1;
		a = a * a;//这里在累计
	}
	return mul;
}

我写的:

我在看上面那篇文章提供的非递归快速幂之前,自己尝试写的非递归快速幂。写完虽然能跑,但是看上去有点low哦...

非常直白的for循环,因为只要循环logn次,所以我直接求对数了!和上面的基本不一样的。其实还是用的和上面的递归一样的思想做的,但是被我生生弄成非递归了哈哈...

#include <iostream>
#include <cmath>
#define MOD 1000000007//取模
//非递归快速幂
//注意1:分0,奇数,偶数
//注意2:为了防止溢出,取模,long long
//这是我写的 有点愚蠢 用了求对数
int qpow1(int a, int n)//a^n
{
	if (n == 0)
		return 1;
	if (n == 1)
		return a;
	long long mul = a;
	if (n & 1)//奇数
	{
		for (int i = 0; i < log2(n - 1); ++i)//取对数
		{
			mul = mul * mul % MOD;
		}
		mul = mul * a % MOD;//因为是奇数所以得补一个
	}
	else//偶数
	{
		for (int i = 0; i < log2(n); ++i)
		{
			mul = mul * mul % MOD;
		}
	}
	return mul;
}

 矩阵快速幂:斐波那契数列

用的是非递归快速幂模板套进去的,太帅了!

再次重申,看我的代码不如看上面那篇。那位大哥写的真好,我也要反复看!

注意1:斐波那契数列的矩阵公式推导,我觉得要自己推一次,非常简单的矩阵公式。
注意2:单位矩阵和斐波那契的矩阵

里面还有矩阵的写法,学到了!

#include <iostream>
#define MOD 1000000007//取模
//矩阵快速幂
//注意1:斐波那契数列的矩阵公式推导
//注意2:单位矩阵和斐波那契的矩阵
struct matrix//矩阵对象
{
	long long a1, a2, b1, b2;
	matrix(long long a1, long long a2, long long b1, long long 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 qpow(matrix a, int n)//a^n	
{
	matrix ans(1, 0, 0, 1);//是单位矩阵
	//|1  0|
	//|0  1|
	while (n)
	{
		if (n & 1)
			ans = a * ans;
		a = a * a;
		n >>= 1;
	}
	return ans;
}

void Test_qpow3()
{
	int n = 6;
	matrix M(0, 1, 1, 1);//注意这里是斐波那契数列推导的矩阵
	long long result;
	if (n != 0)
	{
		matrix ans = qpow(M, n - 1);//这里求的是M^(n-1):底数是M,幂是n-1
		 result = (ans.a1 + ans.a2) % MOD;//求的是F(n)
	}
	else
		result = 0;
	std::cout << result << std::endl;
}

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

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

相关文章

Flutter之Android Studio No connected devices found

看图1. 是有显示有Redmi虚拟机的。 看图2. 没有Redmi虚拟机可选择&#xff0c;继续往下看解决方案。 看图3.点开项目结构设置SDK确定。 看图4.它来了

基于JavaWeb+SSM+Vue实习记录微信小程序系统的设计和实现

基于JavaWebSSMVue实习记录微信小程序系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 目 录 摘 要 III Abstract 1 1 系统概述 1 1.1 概述 2 1.2课题意义 3 1.3 主要内…

thinkphp 中 关联查询 like 查询失效

controller: public function goodsList(){if (request()->isGet()) {//表单验证//调用发布$where [];$goodname $this->request->param(goodname, );if(!empty($goodname)){$where[] [name,like,$goodname];}return $this->logic->goodsList($where, $this-…

【EXCEL】vlookup,index/match查找函数

区别&#xff1a; 1.Vlookup函数只能查找列数据&#xff0c;即纵向查找&#xff0c;而IndexMatch函数&#xff0c;既可以纵向查找&#xff0c;也可以横向查找&#xff1b; 2、Vlookup函数查找的依据(第一个参数)必须位于数据源的第一列&#xff0c;IndexMatch函数组合则无此限制…

​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)

​Linux Ubuntu环境下使用docker构建spark运行环境&#xff08;超级详细&#xff09; 这篇文章深入研究了在Linux Ubuntu环境下使用Docker构建Spark运行环境的详细步骤。首先&#xff0c;文章介绍了Spark的基本概念以及在大数据处理中的关键作用&#xff0c;为读者提供了对Spa…

设计模式——观察者模式(Observer Pattern)

概述 观察者模式是使用频率最高的设计模式之一&#xff0c;它用于建立一种对象与对象之间的依赖关系&#xff0c;一个对象发生改变时将自动通知其他对象&#xff0c;其他对象将相应作出反应。在观察者模式中&#xff0c;发生改变的对象称为观察目标&#xff0c;而被通知的对象称…

广西岑溪市火灾通报:1人死亡 AI科技助力预防悲剧

近日&#xff0c;广西岑溪市玉梧大道紫坭工业园一厂房发生一起令人心痛的火灾事件&#xff0c;造成1人不幸丧生。这起悲剧再次提醒我们&#xff0c;火灾的防范工作是多么的重要。在这样的背景下&#xff0c;我想分享一个能够有效预防类似悲剧的技术——北京富维图像公司开发的F…

鸿蒙原生应用/元服务开发-Stage模型能力接口(三)

一、说明 AbilityLifecycleCallback模块提供应用上下文ApplicationContext的生命周期发生变化时触发相应回调的能力&#xff0c;包括onAbilityCreate、onWindowStageCreate、onWindowStageActive、onWindowStageInactive、onWindowStageDestroy、onAbilityDestroy、onAbilityFo…

力扣题:数字与字符串间转换-12.14

力扣题-12.14 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;442. 数组中重复的数据 解题思想&#xff1a;从字符串中能够正确提取数字即可 class Solution(object):def complexNumberMultiply(self, num1, num2):""":type num1:…

acwing-蓝桥杯C++ AB组辅导课Day1-递归

感谢梦翔老哥的蓝桥杯C AB组辅导课~ 省一刷200题 国赛拿成绩300题 比赛考察的是各种模型的熟练度&#xff0c;可以从dfs的角度比较各个模型与当前问题的匹配程度。 常见时间复杂度&#xff0c;根据时间复杂度可以判别是否可以选用这个解题思路 写递归的时候&#xff…

visual Studio MFC 平台实现图片的傅里叶变换

图片的傅里叶变换 本文主要讲解傅里叶变换的基本数学概念与物理概念&#xff0c;并本文使用visual Studio MFC 平台实现对傅里叶变换在图片上进行了应用。 一、傅里叶变换的原理 在这里推荐一篇讲得非常形象的文章通俗讲解&#xff1a;图像傅里叶变换 1.1 傅里叶变换原理的说明…

kernel(三):kernel移植

本文主要探讨210官方kernel移植。 配置文件选择 选择配置文件smdkv210_android_defconfig(arch/arm/configs) 修改主Makefile 配置cpu架构和交叉编译工具链 vim MakefileARCH ? armCROSS_COMPILE ? /root/arm-2009q3/bin/arm-none-linux-gnueabi- 初步编译烧…

HarmonyOS应用程序框架

应用程序入口—UIAbility的使用 UIAbility概述 UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互。UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面。 每一个UIAbility实例&#xff0c;都对应于一个最近任务列表中的任务。 …

【论文阅读】MAKE-A-VIDEO: TEXT-TO-VIDEO GENERATION WITHOUT TEXT-VIDEO DATA

Make-a-video:没有文本-视频数据的文本-视频生成。 paper&#xff1a; code&#xff1a; ABSTRACT 优点: (1)加速了T2V模型的训练(不需要从头开始学习视觉和多模态表示)&#xff0c; (2)不需要配对的文本-视频数据&#xff0c; (3)生成的视频继承了当今图像生成模型的庞大…

HBase 高可用集群详细图文安装部署

目录 一、HBase 安装部署 1.1 Zookeeper 正常部署 1.2 Hadoop 正常部署 1.3 HBase 安装 1.4 HBase 的配置文件 1.4.1 hbase-env.sh 1.4.2 hbase-site.xml 1.4.3 regionservers 1.4.4 创建目录 1.5 HBase 远程发送到其他节点 1.6 HBase 服务的启动 1.6.1 单点…

用友时空 KSOA 多处SQL注入漏洞复现

0x01 产品简介 用友时空 KSOA 是建立在 SOA 理念指导下研发的新一代产品,是根据流通企业前沿的 IT 需求推出的统一的IT基础架构,它可以让流通企业各个时期建立的 IT 系统之间彼此轻松对话。 0x02 漏洞概述 用友时空 KSOA 系统 PayBill、QueryService、linkadd.jsp等接口处…

数字化赋能实体经济,凌雄科技发挥DaaS模式提质增效价值

11月中旬&#xff0c;市场监管总局发布了2023年前三季度经营主体数据。其中&#xff0c;前三季度全国新设民营企业总计706.5万户&#xff0c;截至9月底&#xff0c;全国登记在册的民营企业数量超过5200万户&#xff0c;在企业总量中占比高达92.3%。如何帮助民营企业实现高质量发…

中海达亮相能源北斗与时空智能创新技术应用大会

12月7日-8日&#xff0c;2023年能源北斗与时空智能创新技术应用大会暨鹭岛论坛在厦门举办。本次活动以“能源北斗时空智能”为主题&#xff0c;由中关村智能电力产业技术联盟、中国能源研究会、中国卫星导航定位协会、中国电力科学研究院有限公司、国网信息通信产业集团有限公司…

探索 Vim:一个强大的文本编辑器

引言&#xff1a; Vim&#xff08;Vi IMproved&#xff09;是一款备受推崇的文本编辑器&#xff0c;拥有强大的功能和高度可定制性&#xff0c;提供丰富的编辑和编程体验。本文将探讨 Vim 的基本概念、使用技巧以及为用户带来的独特优势。 简介和发展 1. Vim 的简介和历史 V…

0基础学习VR全景平台篇第127篇:什么是VR全景/720全景漫游?

“全景”作为一种表现宽阔视野的手法&#xff0c;在很久之前就得到了普遍的认同。北宋年间&#xff0c;由张择端绘制的《清明上河图》就是一幅著名的全景画。摄影术出现后&#xff0c;全景摄影也随之而生。 到今天&#xff0c;全景拍摄不再被专业摄影师所独享&#xff0c;广大…