标签:ak mk bk 问题 therefore ans equiv
题目描述
求 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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。