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

本文详细介绍了一种高效计算幂运算的方法——快速幂算法。通过将指数转换为2的幂次和的形式,快速幂能够显著减少计算步骤,从O(n)降低到O(logn)。文章不仅提供了直观的解释和示例,还给出了两种实现方式(迭代和递归),并附上了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:hdu 2035 人见人爱A^B

      很早的时候做的一道题了,今天想想把他翻了出来,写篇文章来为不知道快速幂的同学做一个科普(请允许我吹一下牛逼大笑)。快速幂可以高效的计算幂运算。如果我们使用循环来计算的话,那么时间复杂度就是 O(n) ,使用快速幂的话就只用 O(log n)。不要小看这么一点点,如果一个问题需要多次 的 幂运算的话,可能就会因为这一点小小的变化而超时。

快速幂介绍:

       我们一直说快速幂快,那他究竟是在哪里快呢? 如果我们求解 2^k。可以将其表示为

             x^n =( (x²)²....)

      只要做k次平方运算就可以了,由此我们可以想到,先将n表示为2的幂方次之和

             n = 2^k1 + 2^k2 + 2^k3.......

      就有

           x^n = x^(2^k1) x^(2^k2) x^(2^k3).......

     So.快速幂就是这么快。不太明白的可以用笔和纸手动的模拟一下。 

例如: x^22 = x^16·x^4·x^2

快速幂的模板:

  1. typedef long long ll; //注意这里不一定都是long long 有时 int 也行  
  2. ll mod_pow(ll x, ll n, ll mod){  
  3.     ll res = 1;  
  4.     while( n > 0 ){   
  5.         if( n & 1 ) res = res * x % mod;    //n&1其实在这里和 n%2表达的是一个意思  
  6.         x = x * x % mod;  
  7.         n >>= 1;                 //n >>= 1这个和 n/=2表达的是一个意思  
  8.     }  
  9.     return res;  
  10. }  
typedef long long ll; //注意这里不一定都是long long 有时 int 也行
ll mod_pow(ll x, ll n, ll mod){
    ll res = 1;
    while( n > 0 ){ 
        if( n & 1 ) res = res * x % mod;    //n&1其实在这里和 n%2表达的是一个意思
        x = x * x % mod;
        n >>= 1;                 //n >>= 1这个和 n/=2表达的是一个意思
    }
    return res;
}

没看位运算的童鞋,好好回去看看,好多地方都是用这东西

递归版的:

  1. typedef long long ll;  
  2. ll mod_pow(ll x, ll n, ll mod){  
  3.     if( n == 0 ) return 1;  
  4.     ll res = mod_pow( x * x % mod, n / 2, mod );  
  5.     if( n & 1 ) res = res * x % mod;  
  6.     return res;  
  7. }  
typedef long long ll;
ll mod_pow(ll x, ll n, ll mod){
    if( n == 0 ) return 1;
    ll res = mod_pow( x * x % mod, n / 2, mod );
    if( n & 1 ) res = res * x % mod;
    return res;
}


下面附上本题的代码:

  1. #include<stdio.h>  
  2. int mod_pow(int x, int n,int mod){      //快速幂  
  3.     int res = 1;  
  4.     while( n > 0 ){  
  5.         if( n & 1 ) res = res * x % mod;  
  6.         x = x * x % mod;  
  7.         n >>= 1;  
  8.     }  
  9.     return res;  
  10. }  
  11. int main(){   
  12.     int m,n;  
  13.     while(scanf("%d%d",&m,&n),n||m)  
  14.         printf("%d\n",mod_pow(m,n,1000));  
  15.     return 0;  
  16. }  
#include<stdio.h>
int mod_pow(int x, int n,int mod){      //快速幂
    int res = 1;
    while( n > 0 ){
        if( n & 1 ) res = res * x % mod;
        x = x * x % mod;
        n >>= 1;
    }
    return res;
}
int main(){ 
    int m,n;
    while(scanf("%d%d",&m,&n),n||m)
        printf("%d\n",mod_pow(m,n,1000));
    return 0;
}

快速幂延伸:矩阵快速幂

(如有错误,欢迎指正,转载请注明出处)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值