快速幂

快速幂

分治法((指数折半法, O ( log ⁡ 2 n ) O(\log_2 n) O(log2n))

思想:不断 n ≫ 1 n\gg1 n1,每次将指数折半计算

例: a 4 = ( ( a ) 2 ) 2 a^4=((a)^2)^2 a4=((a)2)2, a 5 = ( a 2 ∗ a 2 ) ∗ a a^5=(a^2*a^2)*a a5=(a2a2)a

extern long long a,mod;
long long fastpow(long long n){
    if(!n) return 1;//特判指数为0
    long long t=fastpow(n>>1);//不断向下折半指数
    if(n&1) return ((t*t)%mod*a)%mod;//奇数情形,注意每一步都要取模
    else return (t*t)%mod;
}

二进制法(指数倍增法, O ( log ⁡ 2 n ) O(\log_2 n) O(log2n))

思想:将指数拆分成2为底数倍增

例: ( 11 ) 10 = ( 1011 ) 2 = 1 × 2 3 + 0 × 2 2 + 1 × 2 1 + 1 × 2 0 = 8 + 2 + 1 → a 11 = a 8 + 2 + 1 = a 8 ∗ a 2 ∗ a 1 (11)_{10}=(1011)_2=1\times2^3+0\times2^2+1\times2^1+1\times2^0=8+2+1\rightarrow a^{11}=a^{8+2+1}=a^8*a^2*a^1 (11)10=(1011)2=1×23+0×22+1×21+1×20=8+2+1a11=a8+2+1=a8a2a1

extern long long a,mod,n;
long long fastpow(){
    long long ans=1;
    for(;n;n>>=1){//对n进行按位操作,并逐位右移
        if(n&1) ans=(a*ans)%mod;//判断二进制最后一位是否为1,是否需要乘
        a=(a*a)%mod;//平方进行倍增:a^2,a^4,a^8...
    }
    return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值