快速幂介绍及其模板

1.数的快速幂问题:

所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余)。在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快、计算范围更大的算法,产生了快速幂取模算法。快速幂实际上是求解形如:an%b这种形式。其中a和n可能会很大。

普通解法时间复杂度为O(n),而快速幂则是O(logn),其主体思想如下:将n分解为2进制,n =a0*20+a1*21...+at*2t-1然后就可与分开计算了,例如:39=1*20+0*21+0*22+1*23.注意到2k=2*2k-1,于是将复杂度降低为O(logn).

模板:

LL quik_pow(LL a, LL b, LL n){
	// a^b %n
	LL x(a),d(1);
	while (b > 0){
		if (b & 1) d = d*x%n;
		x = x*x%n;
		b >>= 1;
	}
	return d;
}

  

时间: 2024-10-10 20:54:34

快速幂介绍及其模板的相关文章

快速幂+乘模 模板

/************** 快速幂模板 调用:Quk_Mul(a,b,mod) 返回:a^b%mod 复杂度:当mod>10^9,log(mod)*log(b),否则log(b) ***************/ long long Mod_Mul(long long a,long long b,long long mod) { long long msum=0; while(b) { if(b&1) msum = (msum+a)%mod; b>>=1; a = (a+a)

矩阵快速幂 优化dp 模板

相关博客 :https://blog.csdn.net/china_xyc/article/details/89819376#commentBox 关于能用矩阵乘法优化的DP题目,有如下几个要求: 转移式只有加法,清零,减法etc.,max和min运算不允许 转移式中关于前几位dp结果得到的系数必须是常量 转移次数一般超级多 由于转移次数多,一般都要模一个int范围内的数 综上,举一个例子: dp[i]=a×dp[i−1]+b×dp[i−2]+c×dp[i−3] 其中,a,b,c是常量,而在需要

快速幂取模模板

1 #include<bits/stdc++.h> 2 using namespace std; 3 int MOD; 4 5 int fast_pow_mod(int a, int b) { 6 int res = 1; 7 while(b) { 8 if (b & 1) res = res * a % MOD; 9 a = a * a % MOD; 10 b >>= 1; 11 } 12 return res; 13 } 14 15 int main() { 16 in

【模板】快速幂取模

快速幂取模的模板,要注意所有变量都要开成long long类型的防溢出: #include<cstdio> #include<algorithm> #include<cstring> typedef long long LL; const LL mod=1e9+7; using namespace std; LL a,b; LL mi(LL x,LL y) { LL res=1; while(y){ if(y&1) res=res*x%mod; y>>

hdu2035 人见人爱A^B(快速幂取模)

题目链接:hdu 2035 人见人爱A^B 很早的时候做的一道题了,今天想想把他翻了出来,写篇文章来为不知道快速幂的同学做一个科普(请允许我吹一下牛逼).快速幂可以高效的计算幂运算.如果我们使用循环来计算的话,那么时间复杂度就是 O(n) ,使用快速幂的话就只用 O(log n).不要小看这么一点点,如果一个问题需要多次 的 幂运算的话,可能就会因为这一点小小的变化而超时. 快速幂介绍: 我们一直说快速幂快,那他究竟是在哪里快呢? 如果我们求解 2^k.可以将其表示为 x^n =( (x2)2.

快速幂取模和快乘取模

一.快速幂取模概念 快速幂取模,顾名思义,就是快速的求一个幂式的模(余),比如a^b%c,快速的计算出这个式子的值. 在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法. 二.快速幂取模算法实现 1)很容易能想到,循环b次,每次乘a,最后对c取余就可以了. int ans = 1; for(int i = 1; i<=b; i++) { ans = ans * a; } ans = ans % c; 这个朴素算法的问题是: 1.如果a和b

快速幂取模总结

大白书上说的是模运算..而且给出了递归版的代码..我觉得还是非递归的好..而且加上了位运算,速度更快.下面是快速幂取模模板. 模板: LL quickpow(LL n, LL m, int mod) { LL ans=1; while(m>0) { if(m&1) ans=ans*n%mod; m=m >> 1; n=n*n%mod; } return ans; } 练习题目: HDU 1061 hdu 2035 快速幂取模总结

快速幂模板及讲解

(这篇其实是我用来练习公式编辑器滴,所以讲的内容略水,大佬们也赏脸看看吧) 定义 快速幂即快速求幂(下文为求a的x次幂模m的结果),但我们一般只在要求对一个数的幂取模时才使用,因为有可能结果很大,有可能long long都存不下,但是因为我们有: \((ab)\%m=(a\%m)(b\%m)\) 通过转换,可得: \((a^x)\%m\) \(= (a\times a\times a\times -\times a(共x个a相乘))\%m\) \(= (a\%m)\times (a\times

矩阵快速幂 模板与简单讲解

模板 快速幂模板 1 void solve(matrix t,long long o) 2 { 3 matrix e; 4 5 memset(e.a,0,sizeof(e.a)); 6 7 for (int i = 0;i < d;i++) 8 e.a[i][i] = 1; 9 10 while (o) 11 { 12 if (o & 1) 13 { 14 e = mul(e,t); 15 } 16 17 o >>= 1; 18 19 t = mul(t,t); 20 } 21