矩阵快速幂-QuickPow
矩阵快速幂引入:
1.整数快速幂:
为了引出矩阵的快速幂,以及说明快速幂算法的好处,我们可以先求整数的幂。
如果现在要算X^8:则 XXXXXXXX 按照寻常思路,一个一个往上面乘,则乘法运算进行7次。
(XX)(XX)(XX)(XX)
这种求法,先进行乘法得X^2,然后对X^2再执行三次乘法,这样去计算,则乘法运算执行4次。已经比七次要少。所以为了快速算的整数幂,就会考虑这种结合的思想。
现在要考虑应该怎么分让计算比较快。接下来计算整数快速幂。例如:X^19次方。
19的二进制为:1 0 0 1 1 。
由(X^m)(X^n) = X^(m+n)
则X^19 = (X^16)(X^2)*(X^1)
那么怎么来求解快速幂呢。请看下列代码:
求解X^N的值。
///整数快速幂,计算x^N
int QuickPow(int x,int N)//传入底数x和指数N
{
int res = x;
int ans = ;
while(N)
{
if(N&)//N是奇数
{
ans = ans * res;
}
res = res*res;
N = N>>;//N向右移位
}
return ans;
}
那么让我们来看看下面这段代码到底对不对:
对于X^19来说:
19的二进制为:1 0 0 1 1
初始:
那么让我们来看看下面这段代码到底对不对:
对于X^19来说:
19的二进制为:1 0 0 1 1
初始:
ans = ; res = x;
则10011最后一位是1,所以是奇数。
ans = res*ans = x;
res = res*res = x^;
然后右移一位,1 0 0 1
则1001最后一位是1,所以是奇数
ans = res*ans = x*(x^) = x^ res = res*res = x^*x^ = x^
然后右移一位,1 0 0
则最后一位是0,所以当前的数为偶数。
res = res*res = x^*x^ = x^
然后右移一位,1 0
最后一位是0,当前数是偶数。
res = res*res =x^*x^= x^
然后右移一位,1
最后一位是1,当前数是奇数
ans = ans*res = (x^)*(x^) = x^ res = res*res = x^
2.矩阵快速幂算法篇
算法思想与整数快速幂算法类似:
struct Mat
{
LL m[][];
};//存储结构体
Mat a,e; //a是输入的矩阵,e是输出的矩阵
Mat Mul(Mat x,Mat y)
{
Mat c;
for(int i=;i<=n;++i){
for(int j=;j<=n;++j){
c.m[i][j] = ;
}
}
for(int i=;i<=n;++i){
for(int j=;j<=n;++j){
for(int k=;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&) ans = Mul(ans,x);
x = Mul(x,x);
y>>=;
}
return ans;
矩阵快速幂-QuickPow的更多相关文章
- 2015 多校联赛 ——HDU5302(矩阵快速幂)
The Goddess Of The Moon Sample Input 2 10 50 12 1213 1212 1313231 12312413 12312 4123 1231 3 131 5 5 ...
- HDU 1575(裸矩阵快速幂)
emmmmm..就是矩阵快速幂,直接附代码: #include <cstdio> using namespace std; ; ; struct Matrix { int m[maxn][ ...
- POJ 3070(求斐波那契数 矩阵快速幂)
题意就是求第 n 个斐波那契数. 由于时间和内存限制,显然不能直接暴力解或者打表,想到用矩阵快速幂的做法. 代码如下: #include <cstdio> using namespace ...
- ZZNU 2182 矩阵dp (矩阵快速幂+递推式 || 杜教BM)
题目链接:http://47.93.249.116/problem.php?id=2182 题目描述 河神喜欢吃零食,有三种最喜欢的零食,鱼干,猪肉脯,巧克力.他每小时会选择一种吃一包. 不幸的是,医 ...
- ZOJ - 2853 Evolution 线性变换变成矩阵快速幂
题意:给你N个数,1~N分别为num[i], 以及T个 (i,j,P) 对于每组(i,j,P),让你将 num[i] 减去 P*num[i] 再把 P*num[i] 加到 num[j] 上.T个 ...
- 2013长春网赛1009 hdu 4767 Bell(矩阵快速幂+中国剩余定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4767 题意:求集合{1, 2, 3, ..., n}有多少种划分情况bell[n],最后结果bell[ ...
- hdu 4686 Arc of Dream(矩阵快速幂)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686 题意: 其中a0 = A0ai = ai-1*AX+AYb0 = B0bi = bi-1*BX+BY ...
- 2016"百度之星" - 初赛(Astar Round2A) A.All X 矩阵快速幂
All X Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Des ...
- 2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)
Happy Necklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
随机推荐
- MyBatis基本使用步骤
MyBatis是一个数据持久层(ORM)框架.把实体 类和SQL语句之间建立了映射关系,是一种半自 动化的ORM实现.MyBATIS需要开发人员自己来写sql语句,这可以增加了程序的灵活性,在一定程度 ...
- 850. Dijkstra求最短路 II
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...
- loadrunner没有告诉你的
1. LoadRunner之-Block l 如何在一个脚本中实现不同事务不同次数的循环呢? l 案例:假如你想在一个脚本中,实现登录执行1次,查询执行2次,插入执行3次,怎么办?录 ...
- 码海拾遗:Linux多线程mutex锁
多线程计数,每个线程累加10个数. 实现: #include <stdio.h> #include <stdlib.h> #include <string.h> # ...
- Hexo+Git一个小时快速搭建个人博客
搭建本地环境:Hexo框架 Hexo为何物 Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用Markdown解析文章,并瞬间利用靓丽的主题生成静态网页.其中,Markdown是一个用于将普通 ...
- java的23种设计模式之建造者模式
场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...
- C++走向远洋——61(项目一、排序函数模板)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- pip3 install mysqlclient安装失败
报错信息: OSError: mysql_config not found 解决方法: 执行以下命令 yum install python-devel mysql-devel -y 然后再 pip3 ...
- py基础之模块与包
'''模块:当代码越来越多时,将所有代码放入一个文件中便会无法维护,所以放到多个文件中去,这样每一个py文件就是一个模块 包:模块越来越多时容易重名,便将模块放入不同的包中,每个包中必须有一个__in ...
- PhaserJS 3 屏幕适配时的小坑 -- JavaScript Html5 游戏开发
巨坑:在config内不要把 width 设为 window.innnerWidth在config内不要把 width 设为 window.innnerWidth在config内不要把 width 设 ...