快速幂下的快速乘法

思路类似快速米,

为了防止数相乘超出long long的范围。

复杂度再加一个log(n);

很实用的东西:

ll mut(ll a,ll b)
{
   ll res=0;
   while (b)
   {
     if (b&1)  res=(res+a)%p;
     a=(a+a)%p;
     b>>=1;
   }
   return res;
}

ll mul(ll x)
{
ll c=1,tmp=2;
   while(x)
   {
      if (x&1) c=mut(c,tmp );
        x/=2;
        tmp=mut(tmp,tmp);
     }
    return c;
}

时间: 2024-10-10 20:19:19

快速幂下的快速乘法的相关文章

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

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

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

当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) {

算法学习 - 快速幂和矩阵快速幂(复杂度Olog(n))C++实现

快速幂 快速幂顾名思义,就是快速算某个数的多少次幂.其时间复杂度为 O(log?N), 与朴素的O(N)相比效率有了极大的提高. 快速幂实现原理 快速幂的原理比较好懂,就是说假如我们求的是3^11,其实比较通用的办法就是 for 1:11 a*=3; 时间复杂度为O(n), 那么我们有没有更快的办法呢? 有的~就是下面要说的快速幂. 快速幂就是把指数进行一次log(N)级别的变换.11 = 2^3+2^1+2^0 那么我只需要算3^1和3^2还有3^8这样复杂度就降下来了.算3^1需要一次记为a

二进制快速幂及矩阵快速幂

二进制快速幂 二进制快速幂虽然不难写,但是无奈总是会忘,所以还是在这里把板子写一下. 二进制快速幂很好理解: 假设我们要求a^b,那么其实b是可以拆成二进制的,该二进制数第i位的权为2^(i-1),例如当b==11时,11的二进制是1011,11 = 23×1 + 22×0 + 21×1 + 2o×1,因此,我们将a11转化为算 a2^0*a2^1*a2^3 int poww(int a, int b) { int ans = 1, base = a; while (b != 0) { if (

快速幂与矩阵快速幂

快速幂的思路: 仍然是与2 分法有关的算法:(很多O(logN)的算法都是二分法啊...) 但快速幂有个前题,就是数据类型必须满足结合律 对于一般的解法: A^8 = A * A * A * A * A * A * A * A 总共需要7次乘法运算: 将其平均分解: A^8 = (A * A * A * A) * (A * A * A * A) = (A * A * A * A) ^ 2 这样我们就只需要4次乘法运算了: 我们还可以将其再分解: A^6 = [(A * A) * (A * A)]

快速幂取模&快速乘取模

快速幂取模 即快速求出(a^b)mod c 的值.由于当a.b的值非常大时直接求a^b可能造成溢出,并且效率低. 思路 原理就是基于\(a*b \% c = ((a \% c)*(b \% c))\% c\),\(a^b \% c = (a \% c)^b \% c\)公式. 求解快速幂: 设指数b用二进制表示为\(b = (b_n b_{n-1}...b_2b_1b_0)_2\), \(b = b_0 + b_1*2^1 + b_2*2^2+...+b_{n-1}*2^{n-1} + b_n*

快速幂和矩阵快速幂-模板

快速幂的思想就是减少相乘的次数,将原本n-1次的相乘减小到(lg(n))的复杂度: a^b=(a^2)^(b/2) 这个式子由于/是整除,所以得分奇偶的不同情况,偶数时仍然成立,奇数时需要再乘上一个a: 所以快速幂就是将原本的以a为基本单位的连乘改成以a*a为单位的连乘: 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int quick

快速幂和矩阵快速幂模板

快速幂模板: ll qmod(ll x,ll n,ll mod) { ll res=1; while(n){ if(n&1) res=(res*x)%mod; x=(x*x)%mod; n/=2; } return res; } 例题:hdu 1097 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> usin

探索(数学)(矩阵快速幂)(快速乘)

一句话题意:三维空间划分四维空间,最多能划分成多少个部分. 我们直接想四维的不好想,但是一般这种题我们考虑从低维开始做起. 在经过手算之后我们可以发现: 设\(f(x)\)为零维(点)切一维(线)最多划分的部分,递推式:\(f(x)=f(x-1)+1\) 设\(g(x)\)为一维(线)切二维(平面)最多划分的部分,递推式:\(g(x)=g(x-1)+f(x-1)\) 设\(k(x)\)为二维(平面)切三维(空间)最多划分的部分,递推式:\(k(x)=k(x-1)+g(x-1)\) 设\(h(x)