Description
求a的b次方对p取模的值,其中 0 ≤ a,b,p ≤ 109
扩展题目:POJ1995 Raising Modulo Numbers
Input
a,b,p
Output
输出a的b次方对p取模的值
Sample Input
123478623 0 1000000000
Sample Output
1
本题如用一般的思想是循环b次每层循环进行乘积运算并进行求模运算,所以这里的运算主要卡在了循环上。
这里用快速速幂的原理就是减少循环的次数从而达到开速求解幂的目的。
这里分析b,因为每一个整数都能分解成2^k,当k取不同的值时的求和。
例如:10=2 ^3 + 2 ^1
11=2 ^3 +2 ^1+ 2 ^0
……
所以这里关键的快速幂的代码是
for(;b;b>>=1)//该语句相当于将b分解为了二进制
//这里的a就依次是a^1 a^2 a^4 ……
//并且依据b的二进制的分解判断是否分解为当前幂
{
if(b&1)ans=(ll)ans*a%p;
a=(ll)a*a%p;
}
#include<iostream>
using namespace std;
typedef long long int ll ;
ll power(ll a,ll b,ll p)
{
ll ans=1%p;
for(;b;b>>=1){
if(b&1)ans=(ll)ans*a%p;
a=(ll)a*a%p;
}
return ans;
}
int main(){
ll a,b,p;
cin>>a>>b>>p;
cout<<power(a,b,p);
return 0;
}
Description
求a的b次方对p取模的值,其中 0 ≤ a,b,p ≤ 10^18
Input
a b p
Output
输出a的b次方对p取模的值
Sample Input
92233720368547758 2 100
Sample Output
64
More Samples
//
//综合利用快速乘和快速幂
#include<iostream>
using namespace std;
typedef long long int ll;
ll mul(ll a,ll b, ll p)
{
ll ans=0;
for(;b;b>>=1)
{
if(b&1)ans=(ans+a)%p;
a=a*2%p;
}
return ans;
}
ll power(ll a, ll b,ll p)
{
ll ans=1;
for(;b;b>>=1)
{
if(b&1)ans=ans*a%p;
//若还是用原来的a=a*a%p;会由于数据太大而爆掉
//所以这里用到了快速乘的方法
a=mul(a,a,p)%p;
}
return ans;
}
int main(){
freopen("qwe.txt","r",stdin);
ll a,b,p;
cin>>a;
cin>>b;
cin>>p;
cout<<power(a,b,p);
return 0;
}