快速幂
问题描述:求
问题来源:CH0101
时间复杂度:
#include<iostream>
using namespace std;
typedef long long ll;
ll quickpow(ll a,ll b, ll p){
ll ans = 1;
for(; b; b >>= 1){
if(b & 1) ans = ans * a % p;
a = a * a % p;
}
return ans % p;
}
int main()
{
ll a, b, p;
cin>>a>>b>>p;
cout<<quickpow(a, b, p)<<endl;
return 0;
}
快速乘
问题描述:求
,
问题来源:CH0102
时间复杂度:
#include<iostream>
using namespace std;
typedef long long ll;
ll quickmul(ll a,ll b,ll p){
ll ans = 0;
for(; b; b >>= 1){
if(b & 1) ans = (ans + a) % p;
a = (a + a) % p;
}
return ans % p;
}
int main()
{
ll a, b, p;
cin>>a>>b>>p;
cout<<quickmul(a, b, p)<<endl;
return 0;
}
快速幂和快速乘
可以将它们结合起来
#include<iostream>
using namespace std;
typedef long long ll;
ll quickmul(ll a,ll b,ll p){
ll ans = 0;
for(; b; b >>= 1){
if(b & 1) ans = (ans + a) % p;
a = (a + a) % p;
}
return ans % p;
}
ll quickpow(ll a,ll b,ll p){
ll ans = 1;
for(; b; b >>= 1) {
if(b & 1) ans = quickmul(ans, a, p);
a = quickmul(a, a, p);
}
return ans % p;
}
int main()
{
ll a, b, p;
cin>>a>>b>>p;
cout<<quickpow(a, b, p)<<endl;
return 0;
}