题目:
给
定
a
,
i
,
n
,
求
a
i
m
o
d
n
给定a,i,n,求 a^i mod \quad n
给定a,i,n,求aimodn
最基本的方法是需要i次乘法和取模运算。因为求模有以下性质:
a
m
o
d
n
=
(
a
m
o
d
n
)
m
o
d
n
a \quad mod\quad n = ( a\quad mod\quad n)mod\quad n
amodn=(amodn)modn
较快的算法是通过
a
i
=
{
a
∗
a
i
−
1
i
为
奇
数
(
a
b
/
2
)
2
i
为
偶
数
a^i= \begin{cases} a * a^{i-1} & i为奇数 \\ \\ (a^{b/2})^2 & i为偶数 \\ \end{cases}
ai=⎩⎪⎨⎪⎧a∗ai−1(ab/2)2i为奇数i为偶数
代码:
typedef long long ll ;
ll pow_mod(ll a, ll i) //快速幂
{
if (i == 0) //递归终止条件
return 1 % mod;
ll temp = pow_mod(a, i >> 1); //i>>1 是位运算,相当于i/2
temp = temp * temp % mod;
if (i & 1) //是奇数
temp = (ll)temp * a % mod;
return temp;
}