快速幂_ c++ 模板

title: 快速幂
author: BbiHH
tags:

  • ACM_汇总
  • ‘’
    categories:
  • 快算
  • template
    toc: true
    date: 2019-07-30 17:04:00

(原创)

在很多的ACM题中都会涉及到对数据快速运算的要求,快速运算在节省运行时间方面很多方面都能起到关键性的作用,学会快速幂也很用必要. 在求 逆元 的时候也会有经常用到.

[a^b%p] 问题

快速幂

  • 模板
/*
求 a 的 b 次方对 p 取模的值
*/
int pow(int a,int b,int p)
{
    int ans =  1 % p;
    for(b; b; b>>=1)
    {
        if(b&1) ans = (long long )ans * a % p;
        a = (long long) a * a % p; //权 
    }
    return ans;
}
 核心为幂的分解,如 幂 10 = 2+8 =0*2^0+1*2^1+0*2^2+1*2^3  (1001)
 采用位运算,对b进行二进制分解求积,权动态变化,当取位取到1时,求积.

[a*b%p] 问题

快速积

  • 模板
/*
求 a 乘 b 对 p 取模的值
*/
LL mod(LL a,LL b,LL p)
{
    LL ans = 0;
    for(;b;b>>=1)
    {
        if(b&1) ans = (ans + a) % p;
        a = a * 2 % p;
    }
    return ans;
}
核心为积的分解, a*10 = a*(2+8) = a*(0*2^0+1*2^1+0*2^2+1*2^3) 与快速幂同理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值