乘方快速幂 OR 乘法快速幂

关于快速幂这个算法,已经不想多说,很早也就会了这个算法,但是原来一直靠着模板云里雾里的,最近重新学习,发现忽视了一个重要的问题,就是若取模的数大于int型,即若为__int64的时候应该怎么办,这样就得用到乘法快速幂+乘方快速幂了。

快速幂一般是为了解决乘方取模问题的,显然思想就是二分,下面贴上快速幂模板:

 1 __int64 mulpow(__int64 a,__int64 p,__int64 m)
 2 {
 3     __int64 ans = 1;
 4     while(p)
 5     {
 6         if(p&1)
 7             ans = ans * a % m;
 8         p >>= 1;
 9         a = a * a % m;
10     }
11     return ans;
12 }

但是以上代码有个问题,并不适合m超过int的情况,下面提供m超过int情况的解法

 1 __int64 multi(__int64 a,__int64 b,__int64 n)  //乘法快速幂
 2 {
 3     __int64 temp=0;
 4     while(b)
 5     {
 6         if(b&1)
 7         {
 8             temp+=a;
 9             if(temp>=n)  temp-=n;
10         }
11         a<<=1;
12         if(a>=n) a-=n;
13         b>>=1;
14     }
15     return temp;
16 }
17
18 __int64 mulpow(__int64 a,__int64 m,__int64 n)  //乘方快速幂
19 {
20     __int64 temp=1;
21     a%=n;
22     while(m)
23     {
24         if(m&1)  temp=multi(temp,a,n);
25         a=multi(a,a,n);
26         m>>=1;
27     }
28     return temp;
29 }

但缺点就是速度慢了点,logn*logn的

时间: 2024-12-27 21:16:13

乘方快速幂 OR 乘法快速幂的相关文章

快速求斐波那契数列(矩阵乘法+快速幂)

斐波那契数列 给你一个n:f(n)=f(n-1)+f(n-2) 请求出 f(f(n)),由于结果很大请 对答案 mod 10^9+7; 1<=n<=10^100; 用矩阵乘法+快速幂求斐波那契数列是经典应用: 矩阵公式 C i j=C i k *C k j; 根据递推式 构造2*2矩阵: 原始矩阵 1 0 0 1 矩阵 2 1 1 1 0 原始矩阵与矩阵 2相乘达到转化状态效果: 对矩阵二进行快速幂 乘法:达到快速转化矩阵的效果: 即使达到快速转化状态:那么大的数据范围也很难求解: 高精?这有

Codevs1732-矩阵乘法快速幂

Codevs1732,这道题要求求fibonacci数列的第N项,1 <= n <= 100000000000000,非常大,普通的O(N)的求法肯定会TLE,所以我们需要用的快速幂矩阵乘法,在O(logN)的时间内即可求出.矩阵的乘法是这样的:我们定义X(i,j)表示矩阵第i行第j列的元素.我们定义两个矩阵A和B,A有n行m列,B有m行p列,则此时矩阵A和B的乘法有定义(当且仅当A的列数=B的行数时,A*B有定义):A*B=C,矩阵C为n行p列 ,C(i,j)=Σ(A(i,k)*B(k,j)

斐波那契优化 快速幂+矩阵乘法

题目:你能求得第n个斐波那契数吗?0<n<maxlongint 由于结果太大,输出的结果mod32768 思路:一般的求斐波那契数列的方法有递归,动归,或者用滚动优化,但是空间复杂或者时间复杂度都太高了,现在有一种用矩阵加快速幂的优化算法,可以让时间复杂度维持在logn. 具体的 初始化一个2×2的矩阵,初始值为{1,0,0,1} 则分别代表{a2,a1,a1,a0},把此矩阵平方后得到{2,1,1,0}分别代表{a3,a2,a2,a1}如此下去,便可以得到规律,其实这个算法主要就是优化在快速

[POJ 3150] Cellular Automaton (矩阵快速幂 + 矩阵乘法优化)

Cellular Automaton Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 3048   Accepted: 1227 Case Time Limit: 2000MS Description A cellular automaton is a collection of cells on a grid of specified shape that evolves through a number of dis

HDU 4965 Fast Matrix Caculation ( 矩阵乘法 + 矩阵快速幂 + 矩阵乘法的结合律 )

HDU 4965 Fast Matrix Calculation ( 矩阵乘法 + 矩阵快速幂 + 矩阵乘法的结合律 ) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAX_SIZE 1001 #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MOD 6 typedef long lo

快速乘、快速幂(矩阵快速幂)

当mod一个大数p的时候,还有进行乘法的时候可能会爆long long的时候,就用快速乘或者快速幂. 参考:http://www.cnblogs.com/whywhy/p/5066730.html 先上模板: 快速乘: ll multi(ll a,ll b,ll m) { ll ans=0; while(b) { if(b&1) (ans+=a) %= m; (a=a*2) %= m; b/=2; } return ans; } 快速幂: ll pow_mod(ll a,ll b,ll m) {

算法初步:快速乘,快速幂,矩阵快速幂

原创 by zoe.zhang 在刷题的时候遇到了问题,就是当循环或者递推的次数非常大的情况下获取一定结果,这个时候如果作普通运算,那么很容易就超时了,而且有时候结果也大得超范围了,即使是long long类型的也放不下,然后给了提示说是运用快速幂的思想.所以这里对快速幂做了一点思考和探讨. 1.快速乘,快速幂,矩阵快速幂三者的关系 不管是快速乘,还是快速幂算法,实际上都包含了分解问题的思想在里面,将O(n)的复杂度降到O(lgn).学习的时候,一般学习快速幂算法,再由此推广去解决矩阵快速幂问题

通过程序了解快速幂和模取幂运算的优化

建议先看第三个有解释的程序. 快速幂a^b 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 long a,b,result=1; 7 //a^b 8 scanf("%ld%ld",&a,&b); 9 while (b) 10 { 11 if ((b & 1)==1) 12 result=result*a; 13 a=a*a; 14 b>>=1; 1

关于快速幂、快速乘、矩阵快速幂

一.快速幂 快速幂是用于解决类似$a^b$ $mod$ $p$值类型的问题的.使用普通的方法是从$1$循环至$b$,再逐次累乘,逐次取模.但这种方法对于$b$很大的时候却可能会超时.那么,这时候我们就需要使用快速幂了. 快速幂是基于以下式子: 若$b$ $mod$ $2=1$,则$a^b=a^\frac{b}{2}\times a^\frac{b}{2}\times a$ 若$b$ $mod$ $2=0$,则$a^b=a^\frac{b}{2}\times a^\frac{b}{2}$ 这样,我