您的位置:首页 > 其它

51nod 1046 A^B Mod C

2016-09-13 18:32 393 查看
给出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的话,数太大,无法存放,且时间复杂度是O(b),太大,会超时
因为公式(a*b) mod n=[(a mod n)*(b mod n)] mod n,所以可以得出下列解法
import java.util.Scanner;

public class answer {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
long a=cin.nextLong();
long b=cin.nextLong();
long n=cin.nextLong();
long ans=1;
while(b!=0){
ans=ans*a%n;
b--;
}
System.out.println(ans);
}
}
但是这种解法时间复杂度还是O(b),所以在计算过程中仍然会超时
所以就有了下面这种快速幂取模的算法
参考链接:http://www.cnblogs.com/archimedes/p/3637479.html
快速幂取模算法主要是依靠以下公式:
a^b mod n=[(a^2)^(b/2)] mod n b是偶数
a^b mod n={[(a^2)^(b/2)]*a} mod n b是奇数
import java.util.Scanner;

public class answer {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
long a=cin.nextLong();
long b=cin.nextLong();
long n=cin.nextLong();
long ans=1;
while(b>0){
if(b%2==1){       //如果b是奇数
ans=ans*a%n;
}
b=b/2;
a=a*a%n;
}
System.out.println(ans);
}
}




 

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: