洛谷-P8813 & CSPJ-2022#1 题解
正文
准备知识:快速幂
考虑快速幂(其实本题暴力都能过,谁让我想那么多,害了自己),这里不做具体介绍,已贴网址。
对于每次快速幂前,先检查 \(a\) 以及快速幂中累积的 \(ans\) 是否超过题中给定范围,若超过,结束程序,输出 -1。
注意一下,由于是在每次乘方前进行了一次判断,快速幂的最后一次乘方可能会超出范围,所以快速幂结束时也要判一次。
CODE:
#include<iostream>
using namespace std;
int main(){
ios::sync_with_stdio(false),cin.tie(0);
long long a,b;
cin>>a>>b;
long long ans=1;
while(b>0){
if(ans>1e9 or a>1e9){//每次乘方前的判定
cout<<-1;
return 0;
}
if(b&1) ans*=a;
a*=a;
b>>=1;
}
if(ans>1e9) cout<<-1;//特判
else cout<<ans;
return 0;
}
后附
日志
v1.0 on 2022.11.06: 发布

浙公网安备 33010602011771号