洛谷-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;
}

Happy End。

后附

日志

v1.0 on 2022.11.06: 发布

posted @ 2022-11-06 19:32  IOIAK_wanguan  阅读(127)  评论(0)    收藏  举报