快速幂

快速幂

分治法((指数折半法, 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;
}
posted @   椰萝Yerosius  阅读(1)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示