问题描述
给定A, B, P,求(A^B) mod P。
输入格式
输入共一行。 第一行有三个数,A, B, P。
输出格式
输出共一行,表示所求。
样例输入
2 5 3
样例输出
2
数据规模和约定
A, B为64位范围内的非负整数,P为32位范围内的非 负整数
//递归快速幂
解决方法
不能直接采用pow函数,由于A=1000,B=1000, (A^B) 都将是一个天文数据(基本数据类型无法装下,计算复 杂)。
思路:
10^1%7
=10%7
=3
10^2%7
=100%7
=2
换个解法,根据公式进行降幂:
10^2%7 =(1010)%7------根据公式(ab)%c=((a%c)(b%c))%c =((10%7)(10%7))%7 =(33)%7 =2
那么
10^4%7
=((10^2%7) (10^2%7))%7
=(22)%7
=4
那么
10^5%7
=((10(10^4))%7
=((10%7)(10^4%7))%7
=(34)%7
=5
long powAndMod(long a, long b, int p)
{
long result = 1;
long mod = a % p;
if(b==0) return 1;
if(b % 2 == 1){
b--;
long c=powAndMod(a, b, p);
result=(result*mod*c)%p;
}
else{
b/=2;
long c=powAndMod(a, b, p);
result=(result*c*c)%p;
}
return result;
}
//通过位运算来解题
原理和上述类似。
通过b&1判断是否b的最后一位是否为1,是1就执行ans*a的操作,不论是不是都要执行a*a的操作以及b>>1,因为这代表着b的每个位上a的值
即:a,a^2, a^4…
#include<iostream>
using namespace std;
#define ll long long
ll powAndMod(ll a,ll b,ll m)//a^b%m
{
a=a%m;
ll ans=1;
while(b)
{
if(b&1)
{
ans=ans*a%m;
//可用快速乘优化,快速乘=》看上一篇博客
/*ans=mil(ans,a,m);*/
}
a=a*a%m;
/*a=mil(a,a,m);*/
b>>=1;
}
return ans;
}