快速幂矩阵快速幂

快速幂

题目链接:https://www.luogu.org/problemnew/show/P1226

快速幂用了二分的思想,即将\(a^{b}\)的指数b不断分解成二进制的形式,然后相乘累加起来,就是用\(a^{b/2}×a^{b/2}\)去求\(a{^b}\)

例如:\(a^{11}=a^{(2^0+2^1+2^3)}\)

程序实现是这样的(使用了位运算):

ll pow(ll b,ll p,ll k)
{for(;p;p>>=1) //  >> 右移等同于 /2{if(p&1)  //判断p是否为奇数,是则返回trueans=ans*b%k;b=b*b%k;}return ans%k;   
}

AC代码

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
int k=1,m=0,flag;
ll ans=1;
ll pow(ll b,ll p,ll k)
{for(;p;p>>=1){if(p&1)ans=ans*b%k;b=b*b%k;}return ans%k;   
}
int main()
{ll b,p,k;cin>>b>>p>>k;ll m=pow(b,p,k)%k;printf("%d^%d mod %d=%d",b,p,k,m);  return 0;
}

矩阵快速幂

题目链接:https://www.luogu.org/problemnew/show/P3390

矩阵运算法则

矩阵A的大小为\(n×m\),B的大小为\(n×k\),设\(C=A×B\)

\(C_{i,j}=\sum\limits_{k=1}^{n}A_{i,p}×B_{p,j}\)

例:
241f95cad1c8a78604df98a26109c93d71cf50a1.jpg

矩阵乘满足结合律:\((AB)C=A(BC)\)

有一种特殊的矩阵:单位矩阵,它从左上角到右下角的对角线上的元素均为1,除此以外全都为0。它在矩阵乘中相当于数乘中的1,即任何矩阵乘它都等于本身。

以上这些就是打出矩阵快速幂前必备的基础知识了。

代码实现

  • 理解了矩阵乘法之后,我们就可以用函数来模拟矩阵乘了。
Mat Mul(Mat x,Mat y)
{for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c.m[i][j]=0;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++){c.m[i][j]=c.m[i][j]%mod+x.m[i][k]*y.m[k][j]%mod;}return c; 
}
  • 因为矩阵乘满足结合律,所以快速幂完全适用于矩阵,矩阵快速幂和普通快速幂几乎一模一样,不同点在于“*”号改成了Mul函数(不会普通快速幂的请前往P1226)
Mat pow(Mat x,ll y)
{Mat ans=e;while(y){if(y&1)ans=Mul(ans,x);  x=Mul(x,x);y>>=1;}return ans;
}

知道了这些后,这道题基本就可以AC了

最后要注意开long long,不然会爆零。

AC代码:


#include<iostream>
#include<cstring>
#define mod 1000000007
#define ll long long
using namespace std;
struct Mat{ll m[101][101];
};//结构体存矩阵 
Mat a,e;//a是输入的矩阵,e是单位矩阵 
ll n,p;
Mat Mul(Mat x,Mat y) //矩阵乘 
{Mat c;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c.m[i][j]=0;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++){c.m[i][j]=c.m[i][j]%mod+x.m[i][k]*y.m[k][j]%mod;}return c; 
}
Mat pow(Mat x,ll y) //矩阵快速幂 
{Mat ans=e;while(y){if(y&1)ans=Mul(ans,x);  x=Mul(x,x);y>>=1;}return ans;
}int main()
{//输入 cin>>n>>p;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>a.m[i][j];//算法核心     for(int i=1;i<=n;i++)e.m[i][i]=1;    Mat ans=pow(a,p);//输出 for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)cout<<ans.m[i][j]%mod<<" ";cout<<endl;}  return 0;
}

广告时间

在下的洛谷博客&&博客园博客

转载于:https://www.cnblogs.com/wxl-Ezio/p/8520427.html

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

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

相关文章

前端项目里常见的十种报错及其解决办法

错误一&#xff1a;Uncaught TypeError: Cannot set property onclick of nullat operate.js:86图片.png原因&#xff1a;当js文件放在head里面时&#xff0c;如果绑定了onclick事件&#xff0c;就会出现这样的错误&#xff0c;是因为W3School的写法是浏览器先加载完按钮节点才…

监控oracle数据io,Prometheus监控Oracle数据库

背景本文简单介绍下&#xff0c;Prometheus如何通过exporters监控Oracle数据库&#xff0c;以及应该注意哪些指标。oracledb_exporteroracledb_exporter是一个连接到Oracle数据库并生成Prometheus metrics的应用程序&#xff0c;设置展示下如何安装和设置oracledb_exporter&…

默认HotSpot最大直接内存大小

在我以前的博客文章热点选项中的Java 8改进的文档 &#xff0c;我写的误解围绕热点JVM非标准的默认设置选项 -XX:MaxDirectMemorySize 。 在本文中&#xff0c;我介绍了一种确定HotSpot JVM中“默认”最大直接内存大小的简单方法。 Java启动器的Java 8文档针对-XX:MaxDirectMe…

window 下 Atom 侧边栏字体大小设置

在 File 处找到 Settings 点击找到 Themes 点击找到 your stylesheet 点击在 .tree-view 处设置即可, (按照 css 样式来写即可保存生效)。转载于:https://www.cnblogs.com/zhourongcode/p/8521317.html

php workman 多线程,workerman如何多线程

Workerman有一个依赖pthreads扩展的MT多线程版本&#xff0c;但是由于pthreads扩展还不够稳定&#xff0c;所以这个Workerman多线程版本已经不再维护。 (推荐学习&#xff1a; workerman教程)workerman\mqtt 是一个基于workerman的异步mqtt 客户端库&#xff0c;可用于接收或者…

python面向对象封装

封装是指将功能模块化&#xff0c;比如&#xff0c;我们写了一个求和函数就是封装&#xff0c;函数使用者不需要了解函数内部是如何实现求和的&#xff0c;只需要调用我们写好的函数就行了。把很多数据封装到一个对象中&#xff0c;把固定功能的代码封装到一个代码块&#xff0…

Java嵌入oracle,Java插入Oracle Spatial空间数据

Java读取地理信息数据文件&#xff0c;并将其存入Oracle数据库。package file;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.Res…

js Object的属性 Configurable,Enumerable,Writable,Value,Getter,Setter

对象的数据属性 Configurable,Enumerable,Writable,Value var person {} Object.defineProperty(person,name,{configurable:false,//能否使用delete、能否需改属性特性、或能否修改访问器属性、&#xff0c;false为不可重新定义&#xff0c;默认值为true enumerable:false,//…

SpringBoot AutoConfiguration魔术如何工作?

在我以前的文章中&#xff0c; 为什么选择SpringBoot&#xff1f; 我们已经研究了如何创建SpringBoot应用程序。 但是您可能会也可能不会了解幕后发生的事情。 您可能想了解SpringBoot自动配置背后的魔力。 但是在此之前&#xff0c;您应该了解Spring的Conditional功能&#x…

linux常用网络命令详解,linux网络命令详解(鸟哥)

[rootlinux ~]# tcpdump [-nn] [-i 介面] [-w 儲存檔名] [-c 次數] [-Ae][-qX] [-r 檔案] [所欲擷取的資料內容]參數&#xff1a;-nn&#xff1a;直接以 IP 及 port number 顯示&#xff0c;而非主機名與服務名稱-i &#xff1a;後面接要『監聽』的網路介面&#xff0c;例如 et…

Bzoj2694/Bzoj4659:莫比乌斯反演

Bzoj2694/Bzoj4659:莫比乌斯反演先上题面:首先看到这数据范围显然是反演了&#xff0c;然而第三个限制条件十分不可做。于是我们暂且无视他&#xff0c;大不了补集转化算完再减是吧。于是我们有:这里我们定义:于是这个东西我们可以nlogn筛的说。也就是说&#xff0c;我们求出f的…

linux系统嵌入式编译环境,Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解...

Linux版本&#xff1a;Ubuntu 12.04 内核版本&#xff1a;Linux 3.5.0 交叉编译器版本&#xff1a;arm-linux-gcc-4.4.3 交叉编译器下载 见这篇文章http://www.linuxidc.com/Linux/2011-05/35906.htm安装前的絮叨首先简单介绍一下&#xff0c;所谓的搭建交叉编译环境&#xff0…

JUnit 5 –下一代JUnit的初步了解

2月初&#xff0c; JUnit 5&#xff08;又名JUnit Lambda&#xff09;团队发布了一个alpha版本。 由于JUnit 4是我工具箱中使用最频繁的项目之一&#xff0c;因此我认为值得一看下一个主要版本。 我试用了最新版本&#xff0c;并记下了我在这里发现值得注意的更改。 安装JUni…

Geany——Python配置

Geany是一个很不错的编辑器&#xff0c;操作很简单&#xff0c;这里记录一下Geany的入手设置&#xff08;在下是一个Python程序猿&#xff0c;就以Python为例&#xff09;&#xff1a; 1&#xff1a;新建&#xff1a;选择 下拉菜单中的 main.py &#xff0c;然后就能生成Pyth…

linux权限drwx,linux权限基础知识详解

祥哥今天整理一下Linux系统中的权限到底是什么&#xff1f;什么是775&#xff1f;什么又是777&#xff1f;664又代表了什么&#xff1f;1.查看权限可以使用ls -l命令ls -l我们以root文件夹为例来说明&#xff1a;drwx------.2 root rootd:这个代表是目录&#xff0c;也就是文件…

cargo maven_用于集成测试的Maven Cargo插件

cargo maven在项目生命周期中&#xff0c;非常普遍的需求是设置集成测试。 幸运的是&#xff0c;Maven在默认构建生命周期的以下阶段&#xff08;来自Maven 文档 &#xff09;具有对这一确切方案的内置支持&#xff1a; 集成前测试 &#xff1a; 执行集成测试之前所需的操作。…

linux菜单系统,Linux修改grub菜单

1. 保留上一次 grub 菜单选项1.1 问题每次开机时&#xff0c;大部分 Linux 发行版的 grub 菜单都是定位在首选项位置(即当前系统选项位置)。这就导致如果我们电脑安装了多个系统&#xff0c;那么每次开机进入其他系统都要重新选择 grub 菜单选项。而我们一般都是一段时间固定使…

zookeeper zoo.cfg配置文件

一、zookeeper的配置文件 zoo.cfg 配置文件是我们安装zookeeper的时候复制 重命名出来的文件命令&#xff1a; cp zoo_smaple.cfg zoo.cfgzkServer.sh 获取执行进入zookeeper 查看配置文件cd /myapp/zookeeper/conf执行命令 查看配置文件信息命令&#xff1a;vim zoo.cfg这是…

与Spring和Maven签订合约优先SOAP服务

1.简介 在本教程中&#xff0c;我们将学习使用JAX-WS&#xff0c;Spring和Maven实施合同优先的SOAP服务应用程序。 这是使用合同优先还是代码优先方法的更多设计决定。 在开发基于SOAP的Web服务应用程序时使用应用合同优先的方法最显着的好处是&#xff0c;可以在对合同进行必…

linux 下c内存管理,linux内存管理之malloc

对于内核的内存管理&#xff0c;像kmalloc&#xff0c;vmalloc&#xff0c;kmap&#xff0c;ioremap等比较熟悉。而对用户层的管理机制不是很熟悉&#xff0c;下面就从malloc的实现入手.( 这里不探讨linux系统调用的实现机制. ) ,参考了《深入理解计算机系统》和一些网上的资料…