问题 H: a^b
作者:互联网
题目描述
求 a 的 b 次方对 p 取模的值,其中 0≤a,b≤10^9 0<p≤10^9
输入格式
三个用空格隔开的整数a,b和p。
输出格式
一个整数,表示a^b mod p的值。
输入样例
2 3 9
输出样例
8
此题部分数论知识
a
≡
b
a\equiv b
a≡b modm
⇒
\Rightarrow
⇒
a
k
≡
b
k
a^k \equiv b^k
ak≡bkmodm
此处进行简要证明:
∵
\because
∵
a
≡
b
a\equiv b
a≡b modm
∴
\therefore
∴
a
=
b
+
m
k
a=b+ mk
a=b+mk
∴
\therefore
∴
a
k
=
(
b
+
m
k
)
k
a^k={(b+mk)}^k
ak=(b+mk)k
=
b
k
+
∑
i
=
1
k
C
k
i
b
k
−
i
(
m
k
)
i
= b^k + \sum_{i=1}^{k}C_k^ib^{k-i}{(mk)}^i
=bk+∑i=1kCkibk−i(mk)i
∑
i
=
1
k
C
k
i
b
k
−
i
(
m
k
)
i
m
o
d
m
=
0
\sum_{i=1}^{k}C_k^ib^{k-i}{(mk)}^imodm=0
∑i=1kCkibk−i(mk)imodm=0
∴
\therefore
∴
a
k
≡
b
k
a^k \equiv b^k
ak≡bkmodm
即:
若
a
m
o
d
m
=
a
n
s
a mod m = ans
amodm=ans
⇒
\Rightarrow
⇒
a
k
m
o
d
b
=
a
n
s
k
a^kmodb=ans^k
akmodb=ansk
观察b的取值 10^9 导致暴力解法会超时,所以需要用快速幂的算法进行求幂
#include<iostream>
using namespace std;
int main()
{
long long a, b, p,ans = 1;
cin >> a >> b >> p;
while (b)
{
if (b & 1)
ans = ans * a % p;
a = a * a % p;
b >>= 1 ;
}
cout << ans % p;
}
标签:ak,mk,bk,问题,therefore,ans,equiv 来源: https://blog.csdn.net/m0_51717226/article/details/122598730