问题:
暴力算法:
long long ans=1;
for(long long i=1;i<=b;i++){
ans*=a;
}
ans%=c;
这个算法有缺陷,时间复杂度是O(b),题中b最大是10^18,比赛肯定会超时的,ans的值也很容易超过long long的范围
算法优化:
我们可以尝试进行算法优化,就是ans每*一次a,就对ans取一次模,防止ans超出long long的范围
long long ans=1;
for(long long i=1;i<=b;i++){
ans*=a;
ans%=c;
}
ans%=c;
另外,我们还可以进行一次时间复杂度的优化
#include<iostream>
using namespace std;
typedef long long ll;
ll fast_power(ll a,ll b,ll c){
ll ans=1;
ans%=c;
while(b){
if(b%2==1){ //如果b是奇数,if条件还可以写成b&1
ans*=a;
ans%=c;
}
a=a*a;
a=a%c;
b/=2; //可以写成b>>=1
}
return ans;
}
int main(){
ll a,b,c;
cin>>a>>b>>c;
ll result=fast_power(a,b,c);
cout<<result;
return 0;
}
这个时间复杂度是log2(b)=log2 (10^18)=59.7