一.题目来源
http://acm.fzu.edu.cn/problem.php?pid=1759
二.题目大意
求解 A B m o d C {A^B}\bmod C ABmodC的结果(1<=A,C<=1000000000,1<=B<=10^1000000)
三.解题思路
显然直接计算会超时。在遇到 A B A^B AB时,我们一般会想到用快速幂算法(log(n))来快速求解,但这题当中B的值可以是10^1000000,这个数字很大很大,远超long long的最大取值。单纯靠快速幂算法也无法满足题目的时间要求,因此再引入欧拉降幂算法来进一步加速计算。
四、算法介绍
1.快速幂
代码如下:
#define ll long long
ll fastpow(int a,int n){
//计算a^n
ll ans=1;
while(n){
if(n&1) ans=ans*a; //n&1 判断此时以二进制表示的n的末位是否为1
n>>=1; //以二进制表示的n整体往右移动一位,高位补0,低位舍去
a=(ll)a*a;
}
return ans;
}
模拟示例
计算 3 9 3^9 39,对照代码中a=3,n=9(二进制表示为1001)
- 第一轮while循环:n&1=9&1=1,ans=ans×a=1×3=3 ,n=(100)D=4,a=a×a=9
- 第二轮while循环:n&1=4&1=0,ans不变,n=(10D)=2,a=a×a=81
- 第三轮while循环:n&1=2&1=0,ans不变,n=(1D)=1,a=a×a=6561
- 项目3.第四轮while循环:n&1=1&1=1,ans=ans×a=3×6561=19683,n=(0D)=0,a=a×a=