快速幂&&矩阵快速幂
快速幂
题目链接: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是否为奇数,是则返回true
ans=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}\)
例:

矩阵乘满足结合律:\((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;
}
广告时间
快速幂&&矩阵快速幂的更多相关文章
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- 快速幂 & 矩阵快速幂
目录 快速幂 实数快速幂 矩阵快速幂 快速幂 实数快速幂 普通求幂的方法为 O(n) .在一些要求比较严格的题目上很有可能会超时.所以下面来介绍一下快速幂. 快速幂的思想其实是将数分解,即a^b可以分 ...
- jiulianhuan 快速幂--矩阵快速幂
题目信息: 1471: Jiulianhuan 时间限制: 1 Sec 内存限制: 128 MB 提交: 95 解决: 22 题目描述 For each data set in the input ...
- 【数论】 快速幂&&矩阵快速幂
首先复习快速幂 #include<bits/stdc++.h> using namespace std; long long power(long long a,long long b,l ...
- 整数快速乘法/快速幂+矩阵快速幂+Strassen算法
快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c 二.矩 ...
- [板子]快速幂&矩阵快速幂
不会的来这看:https://www.cnblogs.com/CXCXCXC/p/4641812.html 简单的一说:当转换为二进制的时候有位运算这种黑科技,&相当于%2判断奇偶性. x&a ...
- hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速 ...
- 矩阵快速幂模板(pascal)
洛谷P3390 题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格 ...
- 培训补坑(day10:双指针扫描+矩阵快速幂)
这是一个神奇的课题,其实我觉得用一个词来形容这个算法挺合适的:暴力. 是啊,就是循环+暴力.没什么难的... 先来看一道裸题. 那么对于这道题,显然我们的暴力算法就是枚举区间的左右端点,然后通过前缀和 ...
随机推荐
- vue key值的重复键问题报错
1.问题描述:在vue2.0+ 中做一个公用的评论组件,:key使用的时创建评论的时间,当加载更多的时候,会报错: Duplicate keys detected: '2019-01-24T07:15 ...
- bzoj 2502: 清理雪道【有上下界有源汇最小流】
对于原有边,流区间是(1,inf),按着原边连,然后再连(s,i,(0,inf)),(i,t,(0,inf))表示任意位置进出雪场 按着这个建出新图 然后最小流的方法是先跑可行流,设ans为(t,s, ...
- MySQL索引的学习
MySQL索引的学习 关于使用mysql索引的好处,合理的设计并使用mysql索引能够有效地提高查询效率.对于没有索引的表,单表查询可能几十万数据就是平静,在大型网站单日可能会产生几十万甚至几百万的数 ...
- hyperledger fabric 1.0.5 分布式部署 (四)
chaincode 的开发 作者在hyperledger fabric 1.0.5 分布式部署 (三)中向读者介绍了如何开发fabric 的chaincode,那么实际上chaincode 还有其他的 ...
- webSocket的学习以及问题的解决
查过很多资料,感觉大部分都讲的不够详细,做为一个新人我从webSocket的基本开始学起, 首先webSocket的原理其实和Http差不多,但是由于Http只能被动的去向服务器请求消息,导致缺点太明 ...
- 关于MySQL集群架构优劣势与适用场景的分析与思考
http://blog.itpub.net/25723371/viewspace-1977389/
- ADO学途 four day 数据库左右连接
数据库的多表操作 数据库用于存放用户数据,用户数据库的数据又会有不同表来存放不同类型的数据,这这是就会产生多 张表来满足需求.列如,部门表有市场部,技术部,行政部等.,子表就有员工具体信息表用来存放员 ...
- JavaSE 帮助文档下载
- radio与img对齐 (CSS3)
实现方式: html: <div class="pay-four"> <div class="pay-four-border"> < ...
- centos7 更换jdk版本
查看java版本 java -version 如果有java版本(如果没有直接看红色虚线以下的) 输入 rpm -qa | grep java会显示以下几条内容: ******* ******** ...