快速幂取模

给出3个正整数A B C,求A^B Mod C。

例如,3 5 8,3^5 Mod 8 = 3。


Input
3个正整数A B C,中间用空格分隔。(1 <= A,B,C <= 10^9)
Output
输出计算结果


Input示例

3 5 8


Output示例

3


原理
如果求a^b,可以将b转换为二进制数
例如
此处输入图片的描述

11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算此处输入图片的描述

符合下面公式
pow(a,b)=1 (n=0时)
pow(a,b)=pow(x²,n/2) (n为偶数)
pow(a,b)=pow(x²,n/2)*x (n为奇数)

( a x b ) % m= a % m x b % m

算法复杂度O(logn)


完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
__int64 (__int64 a, __int64 b, __int64 c);
int main()
{
__int64 a,b,c,ans;
scanf("%I64d %I64d %I64d",&a,&b,&c);
ans=mod_pow(a,b,c);
printf("%I64dn",ans);
return 0;
}
__int64 (__int64 a, __int64 b, __int64 c)
{
__int64 res=1;
while(b>0)
{
if(b & 1) res=res*a%c;
a=a*a%c;
b >>= 1;
}
return res;
}