【快速幂】快速相关联等 的理解,

【快速幂】理解

记录一下当时是怎么理解的,以备后面忘记可以回顾。
快速幂

普通求 ab, 就是让aaa…乘b次,时间复杂度为O(n)…
快速幂 能快到O(log n).. 原理是

比如 a5。 5 二进制为 0101;a5=a^ (2^ 01 +2^10 +2 ^2*1) ;
5 = 20*1 +21*0 +2 2*1

	a^5^= a^ 2^0^*1  *  a^ 2^1^*0    *  a^2 ^2^*1 ;

代码如下:

int  mod(int a,int b){
int res =1;										
    while(b>0){									//a为数 b为幂   (a^b例如是2^5)
        if(b & 1){									//b &1 为取b的二进制的最后一位(右到左)
            res = res *a;					//如果是1,则让它乘上当前a
        }
        a = a*a;									//a*a =a^2,表示下次二进制走到第二位时a的值		
        												//         对应二进制四位0000  a->a^2->a^4->a^8				
        b>>=1;										//二进制右移一位,倒数第二个现在是倒是第一个,然后重复while
    }														
    return res;
}

一般用到快速幂的情况, 有些算法题 时间限制,取模题 相乘超过long long 等。。

tepedef long long ll;
ll res=1;
while(b>0){
        if(b & 1){
            res = res *a%n;					//取模题 这样不会超long范围
        }
        a = a*a%n;
        b>>=1;
    }
    return res;
}

矩阵快速幂

再补

快速乘

快速乘 和 基本快速幂一样用法
比如 a5 = a201 + a210 + a22*1

int pow_mul(int a,int b){
    int res = 0;          					//为0,
    while(b>0){
        if(b & 1){
            res = (res + a);	  		//相加
        }
        a = a+a;							//相加 2a->4a->8a;
        b >>= 1;
    }
    return res;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值