赞
踩
求 a b % c a^b\%c ab%c 的值,其中 a a a, b b b, c c c是整数,且 0 < a 0<a 0<a, c < 1 0 9 c<10^9 c<109, 0 < b < 1 0 18 0<b<10^{18} 0<b<1018。
∙ \bullet ∙首先想到的最朴素的算法是,考虑用循环直接计算 a b a^b ab的值,最后将其对 c c c取模。
代码如下:
long long ans = 1;
for(long long i = 1; i <= b; i++){
ans *= a;
}
ans %= c;
那么这个算法是有一定缺陷的,它的时间复杂度为 O ( b ) O(b) O(b),并且远远超过了数据类型 l o n g long long l o n g long long的范围。
∙
\bullet
∙取模运算的性质
例如:
(
a
⋅
b
)
%
p
=
[
(
a
%
p
)
⋅
(
b
%
p
)
]
%
p
(a\cdot b)\%p=[(a\%p)\cdot(b\%p)]\%p
(a⋅b)%p=[(a%p)⋅(b%p)]%p
证明:设
{
a
=
k
1
p
+
q
1
b
=
k
2
p
+
q
2
( a ⋅ b ) = ( k 1 p + q 1 ) ⋅ ( k 2 p + q 2 ) (a\cdot b)=(k_1p+q_1)\cdot(k_2p+q_2) (a⋅b)=(k1p+q1)⋅(k2p+q2)
= ( k 1 ⋅ k 2 ⋅ p + k 1 ⋅ q 2 + k 2 ⋅ q 1 ) ⋅ p + q 1 ⋅ q 2 =({k_1}\cdot{k_2}\cdot p+{k_1}\cdot{q_2}+{k_2}\cdot{q_1})\cdot p+{q_1}\cdot{q_2} =(k1⋅k2⋅p+k1⋅q2+k2⋅q1)⋅p+q1⋅q2
所以 ( a ⋅ b ) % p = ( q 1 ⋅ q 2 ) % p (a\cdot b)\%p=({q_1}\cdot{q_2})\%p (a⋅b)%p=(q1⋅q2)%p
所以 a % p = q 1 a\%p={q_1} a%p=q1, b % p = q 2 b\%p={q_2} b%p=q2。
再例如, ( a ⋅ a ⋅ ⋅ ⋅ ⋅ ⋅ a ) % p (a\cdot a\cdot\cdot\cdot\cdot\cdot a)\%p (a⋅a⋅⋅⋅⋅⋅a)%p,每乘一次对 p p p取模, a n s = a n s × a ans=ans\times a ans=ans×a, a n s = a n s % c ans=ans\%c ans=ans%c,通过这种方式可以防止超过 l o n g long long l o n g long long的范围,但还是用了 b b b次循环,时间复杂度还是 O ( b ) O(b) O(b)。
∙ \bullet ∙考虑手算 3 10 3^{10} 310,证明如下:
3 10 = ( 3 2 ) 5 = 9 5 = 9 × 9 4 = 9 × ( 81 ) 2 = 9 × ( 8 1 2 ) 1 3^{10}=(3^2)^5=9^5=9\times 9^4=9\times (81)^2=9\times(81^2)^1 310=(32)5=95=9×94=9×(81)2=9×(812)1
当指数是偶数时,我们可以将指数除以 2 2 2 底数平方,当指数是奇数时,先将 a n s ans ans 乘以底数,再将底数平方,指数整除 2 2 2。
由上可知, b b b 每次都要整除 2 2 2,即 b = 2 n b=2^n b=2n,所以执行的次数是 n n n次,时间复杂度是 O ( l o g 2 b ) O(log_2b) O(log2b)。
ll faster_power(ll a, ll b, ll c) {
ll ans = 1;
a %= c;
while (b) {
if (b & 1) {
ans = (ans * a) % c;
}
a = (a * a) % c;
b >>= 1;
}
return ans;
}
若整数 b b b, m m m互质,并且对于任意的整数 a a a,如果满足 b % a = 0 b\%a=0 b%a=0,则存在一个整数 x x x,使得 a b ≡ a × x ( m o d \frac{a}{b}\equiv a\times x(mod ba≡a×x(mod m ) m) m),则称 x x x 为 b b b 的模 m m m 乘法逆元,记为 x = b − 1 x=b^{-1} x=b−1然后有 b x ≡ 1 ( m o d bx\equiv 1(mod bx≡1(mod m ) m) m)引入乘法逆元,就是为了解决模意义下的除法问题。
b b b 存在乘法逆元的充要条件是 b b b 与模数 m m m 互质,即 g c d ( b , m ) = 1 gcd(b,m)=1 gcd(b,m)=1
由以上可知:
a b ≡ a × x ( m o d \frac{a}{b}\equiv a\times x(mod ba≡a×x(mod m ) m) m)
⇔ \Leftrightarrow ⇔ a b ≡ a × b − 1 ( m o d \frac{a}{b}\equiv a\times b^{-1}(mod ba≡a×b−1(mod m ) m) m)
⇔ \Leftrightarrow ⇔ b × a b ≡ b × a × b − 1 b\times\frac{a}{b}\equiv b\times a\times b^{-1} b×ba≡b×a×b−1
⇔ \Leftrightarrow ⇔ a ≡ a × b × b − 1 a\equiv a\times b\times b^{-1} a≡a×b×b−1
⇔ \Leftrightarrow ⇔ b × b − 1 ≡ 1 ( m o d b\times b^{-1}\equiv 1(mod b×b−1≡1(mod m ) m) m)
在数论中,假如 a a a 是一个整数, p p p 是一个质数
a p ≡ a ( m o d a^{p}\equiv a(mod ap≡a(mod p ) p) p)
如果 a a a不是 p p p的倍数
a p − 1 ≡ 1 ( m o d a^{p-1}\equiv 1(mod ap−1≡1(mod p ) p) p)
例如:设 a = 3 a=3 a=3, p = 5 p=5 p=5,则有:
3 5 − 1 = 3 4 = 81 m o d 3^{5-1}=3^4=81mod 35−1=34=81mod 5 = 1 5=1 5=1
设 p p p 为质数,依据上面的结论得:
b × x ≡ 1 ( m o d b\times x\equiv 1(mod b×x≡1(mod p ) p) p)
⇔ \Leftrightarrow ⇔ b p − 1 ≡ 1 ( m o d b^{p-1}\equiv 1(mod bp−1≡1(mod p ) p) p)
⇔ \Leftrightarrow ⇔ b × b p − 2 ≡ 1 ( m o d b\times b^{p-2}\equiv 1(mod b×bp−2≡1(mod p ) p) p)
⇔ \Leftrightarrow ⇔ a p − 2 ( m o d a^{p-2}(mod ap−2(mod p ) p) p)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。