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) 与快速幂同理