大数取幂的算法

转载自:https://www.ctolib.com/topics-56300.html


1. 幂取模

幂取模是求num<sup>power</sup>%MOD的问题。存在取余公式

(a * b) % p = (a%p * b%p) % p

幂为乘积的累积,因此有

int fastMod(int num, int power, int mod) 
{
  long long result = num;
  long long tmp = 1;
  
  while (power > 0) {
    if (power & 1) {
      // 如果幂为奇数,再乘一次
      tmp = (tmp % mod) * (result % mod) % mod;
    }

    result = (result % mod) * (result % mod) % mod;
    power /= 2;
  }
  
  return result;
}

2. 大数取幂

大数取幂的原理基于取余公式

(a + b) % q = (a%q + b%q) % q

例如,求(10 * 33^3 + 9 * 33^2 + 8 * 33 + 7) % MOD

int nums[4] = {10, 9, 8, 7};
int results = 0;
int power = 33;

for (int i = 0; i < nums.size(); ++i) {
  results = (results * power + nums[i]) % MOD;
}

转载于:https://www.cnblogs.com/kovu/p/7282981.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值