【蓝桥杯】矩阵快速幂

一.快速幂概述

1.引例

1)题目描述:

求A^B的最后三位数表示的整数,A^B表示:A的B次方。

2)思路: 

一般的思路是:求出A的B次幂,再取结果的最后三位数。但是由于计算机能够表示的数字的范围是有限的,所以会产生“指数爆炸”的现象(即发生溢出现象)。

换一种思路来看本题:

取模运算的公式如下:

(a+b)\%p=a\%p+b\%p\\ (a-b)\%p=a\%p-b\%p\\ (a\times b)\%p=(a\%p\times b\%p)\%p

结论:

多个因子连续的乘积取模的结果等于每个因子取模后的乘积再取模的结果。

我们可以借助这个法则,只需要在循环乘积的每一步都提前进行“取模”运算,而不是等到最后直接对结果“取模”,也能达到同样的效果。

3)代码如下:

long long normalPower(long long a,long long b){long long result=1;for(int i=0;i<b;i++){result=(result*(a%1000))%1000;}return result%1000;
}

 

 2.快速幂算法

1)思路:

快速幂算法能够帮我们算出指数非常大的幂。

传统算法时间复杂度高的原因是:指数很大,循环次数多。

核心思想:每一步都将指数分成两半,而相应的底数做平方运算。

2)代码:

//获取最后三位数
long long fastPower(long long base,long long power){long long re=1;while(power>0){if(power%2){//指数为奇数power--;//指数-1,将其变为偶数re=re*base%1000;}power/=2;base=base*base%1000;}return re;
}

 通过位运算进行优化:

long long FastPower(long long base,long long power){long long re=1;while(power>0){if(power&1){re=re*base%1000;}power=power>>1;base=(base*base)%1000;}return re;
}

二.矩阵快速幂

矩阵乘法:

for(i=1;i<=n;i++)
{for(j=1;j<=n;j++){for(k=1;k<=n;k++){c[i][j] += a[i][k] * b[k][j];}}
}

 矩阵快速幂:

仿照大数的快速幂

//矩阵快速幂
#include<iostream>
#include<cstring>
using namespace std;int M,n;struct node{int m[100][100];
}ans,res;//ans是结果,res为最初的方阵struct node mul(struct node A,struct node B){struct node C;int i,j,k;for(i=0;i<n;i++)for(j=0;j<n;j++)C.m[i][j]=0;for(i=0;i<n;i++){for(j=0;j<n;j++){for(k=0;k<n;k++){C.m[i][j]+=A.m[i][k]*B.m[k][j];}}}return C;
}void quickpower(){int i,j;//初始ans为单位矩阵for(i=0;i<n;i++)for(j=0;j<n;j++)if(i==j)ans.m[i][j]=1;elseans.m[i][j]=0;while(M>0){if(M&1){ans=mul(ans,res);}res=mul(res,res);M=M>>1;}
}
int main(){cin>>n;cin>>M;for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>res.m[i][j];quickpower();for(int i=0;i<n;i++){for(int j=0;j<n;j++)cout<<ans.m[i][j]<<' ';cout<<endl;}return 0;
}

三.实战演练

1.题目描述:

2.问题分析: 

 转换为矩阵相乘的形式。

3.代码实现:

//斐波那契数列
#include<iostream>using namespace std;const int N=1e4;
const long long mod=1e9+7;
int T;
long long a[N];struct node{long long m[2][2];
}ans,res;//矩阵乘法
struct node mul(struct node a,struct node b){struct node c;c.m[0][0]=(a.m[0][0]*b.m[0][0]+a.m[0][1]*b.m[1][0])%mod;c.m[0][1]=(a.m[0][0]*b.m[0][1]+a.m[0][1]*b.m[1][1])%mod;c.m[1][0]=(a.m[1][0]*b.m[0][0]+a.m[1][1]*b.m[1][0])%mod;c.m[1][1]=(a.m[1][0]*b.m[0][1]+a.m[1][1]*b.m[1][1])%mod;return c;
}//矩阵快速幂
struct node matrixPower(struct node base,long long exp){struct node res={1,0,0,1};while(exp>0){if(exp&1){res=mul(res, base);}exp=exp>>1;base=mul(base, base);}return res;
}//求斐波那契数列第n项
long long f(long long n){struct node base={1,1,1,0};struct node res=matrixPower(base, n-1);return res.m[0][0];
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>T;for(int i=0;i<T;i++){cin>>a[i];}for(int i=0;i<T;i++){cout<<f(a[i])<<'\n';}return 0;
}

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

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

相关文章

【博客709】如果victoriametrics的scrape_timeout大于scrape_interval时会怎么样

如果victoriametrics的scrape_timeout大于scrape_interval时会怎么样 背景 我们在配置采集的时候&#xff0c;有时候会不小心配置了scrape_timeout大于scrape_interval&#xff0c;那么这时会出现什么情况呢&#xff1f;vmagent在采集的时候&#xff0c;如果上一次采集还没有完…

[linux初阶][vim-gcc-gdb] TwoCharter: gcc编译器

目录 一.Linux中gcc编译器的下载与安装 二.使用gcc编译器来翻译 C语言程序 ①.编写C语言代码 ②翻译C语言代码 a.预处理 b.编译 c.汇编 d.链接 ③.执行Main 二进制可执行程序(.exe文件) 三.总结 一.Linux中gcc编译器的下载与安装 使用yum命令(相当于手机上的应用…

JavaScript笔记 09

目录 01 DOM操作事件的体验 02 获取元素对象的五种方式 03 事件中this指向问题 04循环绑定事件 05 DOM节点对象的常用操作 06 点亮盒子的案例 07 节点访问关系 08 设置和获取节点内容的属性 09 以上内容的小总结 01 DOM操作事件的体验 js本身是受事件驱动的脚本语言 什…

10_MVC

文章目录 JSON常用的JSON解析Jackson的常规使用指定日期格式 MVC设计模式MVC介绍前后端分离案例&#xff08;开发与Json相关接口&#xff09; 三层架构三层架构介绍 JSON JSON&#xff08;JavaScript Object Notation&#xff09; 是一种轻量级的数据交换格式&#xff0c;是存…

JUC并发编程(七)

1、不可变对象 1.1、概念 不可变类是指一旦创建对象实例后&#xff0c;就不能修改该实例的状态。这意味着不可变类的对象是不可修改的&#xff0c;其内部状态在对象创建后不能被更改。不可变类通常具有以下特征&#xff1a; 实例状态不可改变&#xff1a;一旦不可变类的对象被…

x-cmd-pkg | broot - Rust 开发的一个终端文件管理器

简介 broot 是基于 Rust 开发的一个终端文件管理器&#xff0c;它设计用于帮助用户在终端中更轻松地管理文件和目录&#xff0c;使用树状视图探索文件层次结构、操作文件、启动操作以及定义您自己的快捷方式。 同时它还集成了 ls, tree, find, grep, du, fzf 等工具的常用功能…

unordered系列容器OJ

目录 1、unordered系列容器 2、unordered系列容器OJ 1、重复n次的元素 2、两个数组的交集I 3、两个数组的交集II 4、存在重复元素 5、两句话中不常见的单词 1、unordered系列容器 在C标准库中&#xff0c;unordered系列容器是基于哈希表实现的&#xff0c; 用于存储唯一…

Qt之创建向导用户界面QWizard

文章目录 前言一、他是干什么的二、QWizard的使用2.1 基础使用2.2 QWizard API2.3 QWizardPage API总结前言 在Qt应用程序中,有时需要向用户提供一个逐步引导的界面,以帮助他们完成特定任务或设置。为了实现这样的用户体验,Qt提供了一个名为QWizard的类,可以方便地创建向导…

用html实现一个文章图片缩略展示

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>文章图片缩略展示</title><link rel"stylesheet" href"./style.css"> </head> <body> <div class&qu…

初始《string》及手搓模拟实现《string》

目录 前言&#xff1a; 为什么学习string类&#xff1f; 标准库中的string类 1. string类对象的常见构造 ​编辑 2. string类对象的容量操作 ​编辑 3. string类对象的访问及遍历操作 4. string类对象的修改操作 5. string类非成员函数 vs和g下string结构的说明 vs下s…

k8s1.28.8版本安装prometheus并持久化数据

本文参考 [k8s安装prometheus并持久化数据_/prometheus-config-reloader:-CSDN博客](https://blog.csdn.net/vic_qxz/article/details/119598466)前置要求: 已经部署了NFS或者其他存储的K8s集群. 这里注意networkpolicies网络策略问题&#xff0c;可以后面删除这个策略&#x…

LangChain使用本地LLM的简单实现

所用模型&#xff1a;stable-code-instruct-3b-Q8_0.gguf 下载链接&#xff1a;bartowski/stable-code-instruct-3b-GGUF Hugging Face 详细内容请查看&#xff1a;Introduction | &#x1f99c;️&#x1f517; Langchain 目录 LangChain 代码示例 LangChain LangChain…

证券市场概述

证券市场 证券市场参与者证券发行市场&#xff08;一级市场&#xff09;证券发行方式&#xff08;按发行对象&#xff09;证券发行方式&#xff08;按有无中介&#xff09;证券交易市场&#xff08;二级市场&#xff09;证券交易所场外交易市场&#xff08;店头市场、柜台市场&…

C# 系统学习(事件与委托 )

在C#中&#xff0c;事件是一种特殊的委托类型&#xff0c;用于通知其他类有某件事发生。事件允许一个类公开某些特定的行为&#xff0c;而订阅者可以在这些行为发生时收到通知。委托则是类型安全的函数指针&#xff0c;可以指向具有匹配签名的方法。 C# 中的事件声明与订阅 事…

再生式收音机填坑记

年前踩坑再生式收音机&#xff0c;还是得找机会把坑填上&#xff0c;最终选定了K8TND的方案&#xff0c;其实与Mr. Kitchen的也基本差不多。电路图如下&#xff1a; 实物图如下&#xff1a; 实际接收效果还不错&#xff0c;但是感觉频段上哪哪都是中国之声&#xff0c;对这种…

CSMM软件能力成熟度是什么?一文读懂!

01、CSMM是什么&#xff1f; CSMM是标准T/CESA 1159-2022《软件过程能力成熟度模型》&#xff08;Software capability maturity model&#xff09;的英文简称&#xff0c;是我国基于国家安全和信息安全背景下&#xff0c;在软件过程管理领域对标CMMI的标准&#xff0c;旨在替…

UE4_碰撞_碰撞蓝图节点——Line Trace For Objects(对象的线条检测)

一、Line Trace For Objects&#xff08;对象的线条检测&#xff09;&#xff1a;沿给定线条执行碰撞检测并返回遭遇的首个命中&#xff0c;这只会找到由Object types指定类型的对象。注意他与Line Trace By Channel(由通道检测线条&#xff09;的区别&#xff0c;一个通过Obje…

React系列之合成事件与事件处理机制

文章目录 React事件处理机制原生事件的事件机制事件代理&#xff08;事件委托&#xff09; 合成事件使用合成事件目的合成事件原生事件区别事件池 原生事件和React事件的执行顺序e.stopPropagation() React17事件机制的修改 React事件处理机制 react 事件机制基本理解&#xf…

时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测

时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测&#xff08;完整源码…

Linux(CentOS7)安装软件方式(编译安装,yum,rpm)

目录 前言 安装方式 编译安装 下载 解压 安装 创建软链接 yum rpm 前言 在使用 CentOS 安装软件时&#xff0c;发现安装的方式有好几种&#xff0c;有官网下载 tar 包解压&#xff0c;然后自己编译安装的&#xff0c;也有直接通过 yum 命令一键安装的&#xff0c;还有…