/*
* 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注
给出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
* */
import java.util.Scanner;
public class Main {
public static long powMod(long a,long b,long c){
long res = 1;
while(b>0){
if((b&1)==1){
res = ((res%c)*(a%c))%c;
}
b >>= 1;
a = ((a%c)*(a%c))%c;
}
return res;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
long a = in.nextLong();
long b = in.nextLong();
long c = in.nextLong();
long res = powMod(a,b,c);
System.out.println(res);
}
}
求a^n,先不考虑是否会超出数据表示的精度范围,如果是用for(1:n)循环的话,时间复杂度为O(n),若n值为10^9,往往在oj中就会超时。然而,n是可以用二进制表示的,n = 2^k1 + 2^k2 + 2^k3 + …+ 2^kn (共有log n项), 令pi = 2 ^ ki,则n=p1+p2+…+pn,哪么a ^ n = a^p1 * a^p2 * a^p3*….*a^pn,哪么原先n项相乘就变为了log n项相乘,时间复杂度从O(n)转变为O(log n) 。
现在要求A^156,而156(10)=10011100(2)
也就有A^156=>(A^4)(A^8)(A^16)*(A^128) 考虑到因子间的联系,我们从二进制10011100中的最右端开始计算到最左端。细节就说到这,下面给核心代码:
res = 1;
while(N)
{
if(N&1)
res=res*A;
N>>=1;
A=A*A;//A是在变化的,每一位都是前一位乘以”A“
}